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:
没看
#网易##笔试#