2023.9.24 网易游戏雷火 笔试
T1:
求MVP和获胜团队。
思路:
模拟题,开一个mp记录一下每一个球员的信息,统计完毕以后输出结果即可。
AC
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
#define int long long
typedef pair<int,int>PII;
int n;
void solve()
{
cin>>n;
string t1,t2;
cin>>t1>>t2;
map<string,pair<int,int>>mp;
set<string>st;
int sum1=0,sum2=0;
for(int i=1;i<=n;i++)
{
string name;
cin>>name;
string t;
cin>>t;
int val;cin>>val;
if(t==t1)sum1+=val;
else sum2+=val;
mp[name].first+=val;
mp[name].second=i;
st.insert(name);
}
if(sum1==sum2)cout<<"ended in a draw"<<endl;
else if(sum1>sum2)cout<<"TeamA"<<endl;
else cout<<"TeamB"<<endl;
string maxv_name;
int maxv_val=0;
int maxv_t=0x3f3f3f3f;
for(auto c:st)
{
if(mp[c].first>maxv_val)
{
maxv_name=c;
maxv_val=mp[c].first;
maxv_t=mp[c].second;
}else if(mp[c].first==maxv_val&&mp[c].second<maxv_t)
{
maxv_name=c;
maxv_val=mp[c].first;
maxv_t=mp[c].second;
}
}
cout<<maxv_name<<endl;
}
signed main()
{
freopen("test.in","r",stdin);
solve();
return 0;
}
T2:
给定若干名玩家的位置和状态信息以及草丛的位置信息和大小,要求判断是否能够相互看到。
思路:
判断是否在草丛:对于圆形,判断圆心距离即可。对于矩形,判断 $x$和$y$,相对于矩形的 最大,最小边界即可。
剩下的就是判断两者的状态的一些逻辑。
AC
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
typedef pair<int,int>PII;
int n;
struct node{
double x,y;
int b,c;
};
struct cir{
double x,y,r;
};
struct tra{
double x1,y1,x2,y2,x3,y3,x4,y4;
};
bool check1(cir a,node player)
{
return (a.x-player.x)*(a.x-player.x) + (a.y-player.y)* (a.y-player.y) - (a.r)*(a.r)<=0;
}
bool check2(tra a,node player)
{
bool flag=true;
double minv_x=min({a.x1,a.x2,a.x3,a.x4});
double maxv_x=max({a.x1,a.x2,a.x3,a.x4});
if(player.x<minv_x||player.x>maxv_x)flag=false;
double minv_y=min({a.y1,a.y2,a.y3,a.y4});
double maxv_y=max({a.y1,a.y2,a.y3,a.y4});
if(player.y<minv_y||player.y>maxv_y)flag=false;
return flag;
}
void solve()
{
int n,m,q;
cin>>n>>m>>q;
vector<node>player(n+1);
for(int i=1;i<=n;i++)
{
double x,y;
int b,c;
cin>>x>>y>>b>>c;
player[i]={x,y,b,c};
}
vector<cir>a;
vector<tra>b;
for(int i=1;i<=m;i++)
{
int type;cin>>type;
if(type==0)
{
double x,y,r;
cin>>x>>y>>r;
a.push_back({x,y,r});
}else
{
tra tmp;
for(int k=1;k<=4;k++)
{
double x,y;
cin>>x>>y;
if(k==1)tmp.x1=x,tmp.y1=y;
else if(k==2)tmp.x2=x,tmp.y2=y;
else if(k==3)tmp.x3=x,tmp.y3=y;
else tmp.x4=x,tmp.y4=y;
}
b.push_back(tmp);
}
}
for(int i=1;i<=q;i++)
{
int q1,q2;
cin>>q1>>q2;
if(player[q2].b)
{
cout<<0<<endl;
continue;
}else if(player[q1].c==player[q2].c)
{
cout<<1<<endl;
continue;
}else
{
bool flag=false;
for(auto c:a)
if(check1(c,player[q1])&&check1(c,player[q2]))flag=true;
for(auto c:b)
if(check2(c,player[q1])&&check2(c,player[q2]))flag=true;
if(flag)
{
cout<<1<<endl;
continue;
}
flag=false;
for(auto c:a)flag|=check1(c,player[q2]);
for(auto c:b)flag|=check2(c,player[q2]);
if(flag)cout<<0<<endl;
else cout<<1<<endl;
}
}
return ;
}
signed main()
{
//freopen("test.in","r",stdin);
solve();
return 0;
}
T3:
给定若干药的属性和价值,求一种特定药的最小花费。
背包求具体方案。这题不会,感觉可能有更好的转移方程吧。
过0.4
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
typedef pair<int,int>PII;
int n,k,x,y;
struct node{
int v,b,c;
};
int dp[201][6][25000][2];
void solve()
{
cin>>n>>k>>x>>y;
vector<node>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i].v>>a[i].b>>a[i].c;
for(int i=1;i<=n;i++)a[i].b--;
x--;
memset(dp,0x3f3f3f3f,sizeof dp);
for(int i=1;i<=k;i++)
{
dp[1][i][a[1].c][a[1].b]=a[1].v;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)dp[i][j][0][0]=dp[i][j][0][1]=0;
for(int i=2;i<=n;i++)
{
int v=a[i].v,id=a[i].b,val=a[i].c;
for(int j=1;j<=k;j++)
{
for(int l=1;l<=20000;l++)
{
dp[i][j][l][0]=min(dp[i][j][l][0],dp[i-1][j][l][0]);
dp[i][j][l][1]=min(dp[i][j][l][1],dp[i-1][j][l][1]);
dp[i][j][l][0]=min(dp[i][j][l][0],dp[i][j-1][l][0]);
dp[i][j][l][1]=min(dp[i][j][l][1],dp[i][j-1][l][1]);
if(id==0)
{
if(l-val>=0)dp[i][j][l][0]=min(dp[i][j][l][0],dp[i-1][j-1][l-val][0]+v);
if(val-l>=0)dp[i][j][l][0]=min(dp[i][j][l][0],dp[i-1][j-1][val-l][1]+v);
dp[i][j][l][1]=min(dp[i][j][l][1],dp[i-1][j-1][l+val][1]+v);
}else
{
dp[i][j][l][0]=min(dp[i][j][l][0],dp[i-1][j-1][l+val][0]+v);
if(l-val>=0)dp[i][j][l][1]=min(dp[i][j][l][1],dp[i-1][j-1][l-val][1]+v);
if(val-l>=0)dp[i][j][l][1]=min(dp[i][j][l][1],dp[i-1][j-1][val-l][0]+v);
}
}
}
}
int ans=0x3f3f3f3f;
for(int i=1;i<=k;i++)ans=min(ans,dp[n][i][y][x]);
if(ans!=0x3f3f3f3f)cout<<ans<<endl;
else cout<<"Cannot Maker It!"<<endl;
return ;
}
signed main()
{
//freopen("test.in","r",stdin);
solve();
return 0;
}
T4:
没看
#网易##笔试#
科大讯飞公司氛围 437人发布