2021年4月1号网易雷火事业部游戏研发岗笔试题解

第一题“打扑克”:纯模拟(10分)

输入输出样例如下:
在这里插入图片描述
AC_code如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=3e5+10;
typedef long long LL;
typedef pair<int,int> PII;
int e[M],w[M],ne[M],h[N],idx;
int dist[N];
bool vis[N];
int cnt[N];

struct f {
    
    
	int num,id;
}s[N];
bool cmp(struct f x,struct f y) {
    
    
	if(x.id==y.id)  return x.num<y.num;
	return x.id<y.id;
}
map<PII,int>mp;

int main()
{
    
    
	int cnt=0;
	for(int i=1; i<=27; i++)
	{
    
    
		int a,b;
		cin >> a >> b;
		if(a==14)
		{
    
    
			int aa = 1;
			if(!mp[{
    
    aa,b}])  s[++cnt]={
    
    aa,b},mp[{
    
    aa,b}]=1;
		}
		if(mp[{
    
    a,b}])  continue;
		mp[{
    
    a,b}] = 1;
		s[++cnt] = {
    
    a,b};
	}
	//cout<<endl;
	sort(s+1,s+cnt+1,cmp);
	int ans=0;
	//for(int i=1;i<=cnt;i++)
	//cout<<s[i].num<<" "<<s[i].id<<endl;
	for(int i=1; i<=cnt; i++)
	{
    
    
		//if(s[i].num>=11) break;
		int flag=0;
		if(i+4>cnt) continue;
		for(int j=i+1; j<=i+4; j++)
		    if(s[j].id!=s[i].id||s[j].num!=s[i].num+j-i||s[j].num>14)
		        flag=1;
		if(!flag)  ans++;
	}
	cout << ans << endl;
	return 0;
}

第二题“钱老板玩MMO”:纯模拟(20分)

输入输出样例如下:
在这里插入图片描述
AC_code如下:

#include <bits/stdc++.h>
using namespace std;
const int N=4e5+10;
typedef long long LL;
typedef pair<LL,LL> PLL;
int n,m;

struct f {
    
    
	int x,y;
}s[N];

int check1(int u)
{
    
    
	int cnt1=0,cnt2=0,cnt3=0,cnt4=0;
	for(int i=1; i<=m; i++)
	{
    
    
		if(s[i].x==s[u].x)  cnt1++;
		if(s[i].y==s[u].y)  cnt2++;
		if(s[i].x-s[u].x==s[i].y-s[u].y)  cnt3++;
		if(s[u].x-s[i].x==s[i].y-s[u].y)  cnt4++;
	}
	int res;
	res=max(cnt1,cnt2);
	res=max(res,cnt3);
	res=max(res,cnt4);
	//cout<<cnt1<<" "<<cnt2<<" "<<cnt3<<" "<<cnt4<<endl;
	return res;
}

int check2(int u)
{
    
    
	int cnt=0;
	int lx=s[u].x-n,rx=s[u].x+n,ly=s[u].y-n,ry=s[u].y+n;
	for(int i=1; i<=m; i++)
	    if(s[i].x<=rx&&s[i].x>=lx&&s[i].y<=ry&&s[i].y>=ly)
	        cnt++;
	return cnt;
}

int main()
{
    
    
	cin >> n >> m;
	for(int i=1; i<=m; i++)
	{
    
    
		int a,b;
		cin >> a >> b;
		s[i]={
    
    a,b};
	}
	int ans=0;
	for(int i=1; i<=m; i++)
	{
    
    
		int t = max(check1(i),check2(i));
		ans = max(ans,t);
	}
	cout << ans << endl;
	return 0;
}

第三题“接水果”:DP(30分)

输入输出样例如下:
在这里插入图片描述
Tips:这题有一个限制,就是x和y组合起来的范围很大,需要建个图。建图可以少去很多无用转移。

AC_code如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=10050;
const int maxm=105;

struct point{
    
    
	int x,y,val;
	point(int x=0,int y=0,int val=0):x(x),y(y),val(val){
    
    }
};

bool operator < (point a,point b){
    
    
	return a.y<b.y||(a.y==b.y&&a.x<b.x);
}

point p[maxn];
int dp[maxn][maxm];
int v,x0,n,m;

void solve() {
    
    
	scanf("%d %d %d %d",&v,&x0,&n,&m);
	for(int i=1; i<=n; i++)	
	    scanf("%d %d %d",&p[i].x,&p[i].y,&p[i].val);
	sort(p+1,p+n+1);
	p[0] = point(x0,0,0);
	int res=0;
	for(int i=1; i<=n; i++) {
    
    
		for(int j=1; j<=m&&i-j>=0; j++) {
    
    
			for(int k=j-1; k<=m-1; k++) {
    
    
				int h = p[i].y-p[i-j].y;
				int l = p[i-j].x-h*v,r=p[i-j].x+h*v;
				if(p[i].x>=l&&p[i].x<=r)
				    dp[i][k] = max(dp[i][k],dp[i-j][k-(j-1)]+p[i].val);
			}
		}
		for(int j=0; j<=m-1; j++)	
		    res = max(res,dp[i][j]);
	}
	printf("%d\n",res);
}

int main() 
{
    
    
	solve();
	return 0;
}

第四题“可视化编程”:猜测是处理出所有开关的状态然后暴力(40分)

猜你喜欢

转载自blog.csdn.net/Luoxiaobaia/article/details/115404889