神智无知(CF)
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);
}

浙公网安备 33010602011771号