A. Matrix Game
题目链接:https://codeforces.ml/contest/1365/problem/A
对矩阵把不可操作的行列除去,得到一个h×w的矩阵
由于每当一个人操作一次,就会占去一行一列,最多操作比较h,w得较小的数为操作次数,当为奇数Ashish赢,偶数Vivek赢
#include <iostream> using namespace std; int t,n,m,h,w; int map[57][57]; int main(){ scanf("%d",&t); while(t--){ scanf("%d %d",&n,&m); h=0,w=0; for(int i=1;i<=n;i++){ int ok=1; for(int j=1;j<=m;j++){ scanf("%d",&map[i][j]); if(map[i][j]==1) ok=0; } if(ok) h++; } for(int i=1;i<=m;i++){ int ok=1; for(int j=1;j<=n;j++){ if(map[j][i]==1) ok=0; } if(ok) w++; } // cout<<h<<" "<<w<<endl; int cnt=min(h,w); if(cnt%2==0) printf("Vivek\n"); else printf("Ashish\n"); } }
B. Trouble Sort
只要b数组不全为0或1,就能把a数组非降序排列,特判a数组本就为非降序排列
#include <iostream> #include <algorithm> using namespace std; int t,n,a[505],b[505],tp[505]; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),tp[i]=a[i]; for(int j=1;j<=n;j++) scanf("%d",&b[j]); sort(tp+1,tp+1+n); int ok=0; for(int i=1;i<=n;i++){ if(tp[i]!=a[i]) ok=1; } if(ok){ int sum=0; for(int i=1;i<=n;i++) sum+=b[i]; if(sum==0||sum==n) printf("No\n"); else printf("Yes\n"); }else{ printf("Yes\n"); } } }
C. Rotation Matching
枚举b数组中bi右移与aj配对为元素对所需的步数,相同步数多的为元素对最多的
#include <iostream> using namespace std; int n,a[200007],b[200007],vis[200007],bok[200007]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),vis[a[i]]=i; for(int i=1;i<=n;i++) scanf("%d",&b[i]); int ans=0; for(int i=1;i<=n;i++){ int dis; if(vis[b[i]]>=i) dis=vis[b[i]]-i; else dis=vis[b[i]]+n-i; bok[dis]++; ans=max(ans,bok[dis]); } printf("%d\n",ans); }