8月20网易笔试感觉题不错写一下还没找到hack数据代码附上

大二acm菜鸡,昨天学姐的面试题,今天瞅了一眼感觉题还不错,就写了一下,还没找到hack数据,感觉应该没什么问题。代码附上,自行查看
题目:题目是自己找的,听说每个人的题还不一样,仔细看清题目再看代码

题目找自网友
题目:
//A题
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+7;
int dp[N][5];
signed main()
{
	string s , rs , ts;
	cin>>s;
	rs=s;
	ts=s;
	int slen=s.length();
	int flag=0;
	if(slen%3==0) flag=1;
	else if(slen%3==1) flag=2;
	else if(slen%3==2) flag=3; 
	int ans=0;
	if(flag==1)
	{
		for(int i=0;i<slen;i++)
		{
			if(i%3==1)
			{
				if(s[i]!='e') ans++;
				if(s[i-1]!='d'&&s[i+1]!='d') ans++;
				if(s[i-1]!='r'&&s[i+1]!='r') ans++;
			}
		}
		cout<<ans<<endl;
	}else if(flag==2)
	{
		for(int i=0;i<slen;i++)
		{
			if(i==0)
			{
				if(s[i+2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i+2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}else if(s[i+2]=='e'&&s[i]=='e')
				{
					s[i]='d';
					dp[i][0]++;
				}
				dp[i][1]=0;
				continue;
			}
			dp[i][0]=dp[i-1][0];
			dp[i][1]=dp[i-1][1];
			if(i%3==0)
			{
				if(s[i+2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i+2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}else if(s[i+2]=='e'&&s[i]=='e')
				{
					s[i]='d';
					dp[i][0]++;
				}
				if(rs[i-2]=='d'&&rs[i]!='r') 
				{
					rs[i]='r';
					dp[i][1]++;
				}else if(rs[i-2]=='r'&&rs[i]!='d') 
				{
					rs[i]='d';
					dp[i][1]++;
				}
                dp[i][1]=min(dp[i][1] , dp[i-1][0]);			
			}else if(i%3==1)
			{
				if(s[i]!='e') dp[i][0]++;
				if(rs[i+2]=='d'&&rs[i]!='r') 
				{
					rs[i]='r';
					dp[i][1]++;
				}else if(rs[i+2]=='r'&&rs[i]!='d') 
				{
					rs[i]='d';
					dp[i][1]++;
				}else if(rs[i+2]=='e'&&rs[i]=='e')
				{
					rs[i]='d';
					dp[i][1]++;
				}				
			}else if(i%3==2)
			{
				if(rs[i]!='e') dp[i][1]++;
				if(s[i-2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i-2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}
			}
		}
		cout<<dp[slen-1][1]<<endl;
	}else if(flag==3)
	{
		for(int i=0;i<slen;i++)
		{
			if(i==0)
			{
				if(s[i+2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i+2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}else if(s[i+2]=='e'&&s[i]=='e')
				{
					s[i]='d';
					dp[i][0]++;
				}
				dp[i][1]=0;
				dp[i][2]=0;
				continue;
			}
			dp[i][0]=dp[i-1][0];
			dp[i][1]=dp[i-1][1];
			dp[i][2]=dp[i-1][2];
			if(i%3==0)
			{
				if(ts[i]!='e') dp[i][2]++;
				if(s[i+2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i+2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}else if(s[i+2]=='e'&&s[i]=='e')
				{
					s[i]='d';
					dp[i][0]++;
				}
				if(rs[i-2]=='d'&&rs[i]!='r') 
				{
					rs[i]='r';
					dp[i][1]++;
				}else if(rs[i-2]=='r'&&rs[i]!='d') 
				{
					rs[i]='d';
					dp[i][1]++;
				}
                dp[i][1]=min(dp[i][1] , dp[i-1][0]);			
			}else if(i%3==1)
			{
				if(s[i]!='e') dp[i][0]++;
				if(rs[i+2]=='d'&&rs[i]!='r') 
				{
					rs[i]='r';
					dp[i][1]++;
				}else if(rs[i+2]=='r'&&rs[i]!='d') 
				{
					rs[i]='d';
					dp[i][1]++;
				}else if(rs[i+2]=='e'&&rs[i]=='e')
				{
					rs[i]='d';
					dp[i][1]++;
				}
				if(ts[i-2]=='d'&&ts[i]!='r'&&i>2) 
				{
					ts[i]='r';
					dp[i][2]++;
				}else if(ts[i-2]=='r'&&ts[i]!='d'&&i>2) 
				{
					ts[i]='d';
					dp[i][2]++;
				}				
				dp[i][2]=min(dp[i][2] , dp[i-1][1]);				
			}else if(i%3==2)
			{
				if(rs[i]!='e') dp[i][1]++;
				if(s[i-2]=='d'&&s[i]!='r') 
				{
					s[i]='r';
					dp[i][0]++;
				}else if(s[i-2]=='r'&&s[i]!='d') 
				{
					s[i]='d';
					dp[i][0]++;
				}
				if(ts[i+2]=='d'&&ts[i]!='r') 
				{
					ts[i]='r';
					dp[i][2]++;
				}else if(ts[i+2]=='r'&&ts[i]!='d') 
				{
					ts[i]='d';
					dp[i][2]++;
				}else if(ts[i+2]=='e'&&ts[i]=='e')
				{
					ts[i]='d';
					dp[i][2]++;
				}
			}			
		}
//		for(int i=0;i<slen;i++) cout<<dp[i][0]<<" "; cout<<endl;
//		for(int i=0;i<slen;i++) cout<<dp[i][1]<<" "; cout<<endl;
//		for(int i=0;i<slen;i++) cout<<dp[i][2]<<" "; cout<<endl;
		cout<<dp[slen-1][2]<<endl;
	}
	return 0;
}
//B题
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+7;
int a[N];
signed main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int maxn1=-1 , maxn2=-1;
	for(int i=1;i<=n;i++)
	{
		if(!(i%2)) maxn2=max(maxn2 , a[i]);
		if(i%2) maxn1=max(maxn1 , a[i]);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(!(i%2)) ans+=maxn2-a[i];
		if(i%2) ans+=maxn1-a[i];
	}
	cout<<ans<<endl;
	return 0;
}

//C题
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int MAXN=0x3f3f3f3f3f3f3f3f;
const int N=1e6+7;
int a[N];
int b[N];
int res=0;
int get(int n){return (int)log10(n)+1;}
map<string , bool>mp;
map<string , bool>mp2;
void dfs_a(string s)
{
	int slen=s.length();
	if(slen==1) return;
	for(int i=0;i<slen;i++)
	{
		string s2=s;
		s2.erase(s2.begin()+i);
		if(mp[s2]==0)
		{
			mp[s2]=1;
//			cout<<res<<endl;
			a[++res]=stoi(s2);
			dfs_a(s2);
		}		
	}
}
int mnt=0;
void dfs_b(string s)
{
	int slen=s.length();
	if(slen==1) return;
	for(int i=0;i<slen;i++)
	{
		string s2=s;
		s2.erase(s2.begin()+i);
		if(mp2[s2]==0)
		{
	    	b[++mnt]=stoi(s2);
	    	mp2[s2]=1;
	    	dfs_b(s2);
		}
	}
}
signed main()
{
	string sa , sb;
	cin>>sa>>sb;
    res=0 , mnt=0;
    a[0]=stoi(sa);
    b[0]=stoi(sb);
    dfs_a(sa);
    dfs_b(sb);
    int ans=MAXN , flag=0;
	for(int i=0;i<=res;i++)
	{
		for(int j=0;j<=mnt;j++)
		{			
			if(a[i]==0||b[j]==0) ans=min(ans , get(a[0])-get(a[i])+get(b[0])-get(b[i]));
			else if((a[i]%b[j]==0)||(b[j]%a[i]==0)) ans=min(ans , get(a[0])-get(a[i])+get(b[0])-get(b[j]));
		}
	}
//	cout<<res<<endl;
//	for(int i=0;i<=res;i++) cout<<a[i]<<" ";cout<<endl;
//	for(int i=0;i<=mnt;i++) cout<<b[i]<<" ";cout<<endl;
//    cout<<cnt<<" "<<mnt<<endl;
	if(ans==MAXN) cout<<-1<<endl;else cout<<ans<<endl;
//	cout<<ans<<endl;
	return 0;
}
//D题
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+7;
int a[N] , b[N] , c[N];
int n , cnt=0;
map<int , int>mp;
void discrete()
{	
	sort(a+1 , a+n+1);
	for(int i=1;i<=n;i++)
	{
		if(i==1||a[i]!=a[i-1]) b[++cnt]=a[i];
	}
}
int query(int x){return lower_bound(b+1 , b+cnt+1 , x)-b;}
struct SegmentTree
{
	int p , l , r;
	int real_num;
	int all;
	int num;
};SegmentTree trie[N<<2];
void build(int p , int l , int r)
{
	trie[p].l=l , trie[p].r=r;
	if(l==r) 
	{
		trie[p].all=mp[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1 , l , mid);
	build(p<<1|1 , mid+1 , r);
	trie[p].num=trie[p<<1].num+trie[p<<1|1].num;
}
void change(int p , int x)
{
	if(trie[p].l==trie[p].r)
	{
		trie[p].real_num++;
		trie[p].num=(trie[p].all-trie[p].real_num)*trie[p].real_num;
		return;
	}
	int mid=(trie[p].l+trie[p].r)>>1;
	if(x<=mid) change(p<<1 , x);
	else change(p<<1|1 , x);
	trie[p].num=trie[p<<1].num+trie[p<<1|1].num;	
}
int sum=0;
void ask(int p , int L , int R)
{
	if(trie[p].l>=L&&trie[p].r<=R)
	{
		sum+=trie[p].num;
		return;
	}
	int mid=(trie[p].l+trie[p].r)>>1;
	if(L<=mid) ask(p<<1 , L , R);
	if(R>mid) ask(p<<1|1 , L , R);
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i];
		c[i]=a[i];
	}
	cnt=0;
	discrete();
	for(int i=1;i<=n;i++) mp[query(c[i])]++;
	build(1 , 1 , cnt);
//	cout<<cnt<<"--"<<endl;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		sum=0;
		ask(1 , query(c[i])+1 , cnt);
		ans+=sum;
//		cout<<sum<<endl;
		change(1 , query(c[i]));
	}
	cout<<ans<<endl;
	
	return 0;
}
一句话题解:
A题:就是简单的逻辑dp,dp[i][j]表示修改到第i个字符,可跳过j个字符情况的最优ans ,我觉得难点就在写的麻烦。。思路挺明了的。时间复杂度o(n)
B题cf*800:跑两个最大值就出来了,奇数位和偶数位最大值,也是一种贪心吧算是,不细说了,看到做法就应该明白了。时间复杂度o(n)
C题:纯dfs暴力,dfs出所有可能出现的字符串(我加了个去重怕超时实际好像不用)时间复杂度o(2的slen-1次方(由组合定理可知))
D题:权值线段树板子题,离散化 ,建立空树,出现一个数插入一个数,维护数字的出现次数,未出现次数以及总个数,查询的时候找某个数字比他大的数字的出现过的次数*未出现过的次数的和就可以了时间复杂度o(nlogn);



#网易笔试#
全部评论
A题麻烦了?直接贪心构造。奇串直接redered或dereder两种情况check一下,偶串枚举分割点变成两个奇串。。。
点赞 回复 分享
发布于 2022-08-22 09:07 上海
终于看懂了线段树,原来是预先求出所有数的出现次数,这样就维护左次数就行了。
点赞 回复 分享
发布于 2022-08-22 17:29 湖南

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
10 22 评论
分享
牛客网
牛客企业服务