A:http://codeforces.com/contest/1395/problem/A
题意:
给出四种颜色球的数目。
操作:前三个颜色的球各减一,变成第四种。
是否能让所有球组成回文?
解析:
构成回文的条件:均为偶数或者只含一个奇数
对于第四种球,如果被操作,就是+3
可以发现,+3一次就能改变本身的奇偶性,+6奇偶性不变。所以,只操作一次,就能判断结果。
先统计奇偶数,以及前三个为0的数目c0,如果本身就能构成回文,直接yes,否则,就在c0==0的情况下,操作一次再判断。
#include<bits/stdc++.h> #define N 500009 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=1e5+10; const int mod=1e9+7; //char mp[maxn][maxn]; int a[maxn]; int b[maxn]; int main() { int t; cin>>t; while(t--) { ll a[12]; cin>>a[1]>>a[2]>>a[3]>>a[4]; int j=0,o=0; int c0=0; for(int i=1;i<=4;i++) { if(a[i]%2==0) o++; else j++; if(a[i]==0&&i<4) c0++; } if(j==1||(o==4)) { cout<<"Yes"<<endl; } else if(c0!=0) { cout<<"No"<<endl; } else { a[1]-=1; a[2]-=1; a[3]-=1; a[4]+=3; j=0; o=0; for(int i=1;i<=4;i++) { if(a[i]%2==0) o++; else j++; } if(j==1||o==4) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } }
B:http://codeforces.com/contest/1395/problem/B
题意:
访问同一行或同一列可以跳着放,求访问所有点的顺序。
解析:
先将起点行左右跑一遍,然后蛇形跑每一列即可。
#include<bits/stdc++.h> #define N 500009 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=1e2+10; const int mod=1e9+7; int vis[maxn][maxn]; //char mp[maxn][maxn]; int a[maxn]; int b[maxn]; int main() { int n,m,x,y; memset(vis,0,sizeof(vis)); cin>>n>>m>>x>>y; cout<<x<<' '<<y<<endl; vis[x][y]=1; for(int i=y-1;i>=1;i--) { if(!vis[x][i]) { cout<<x<<" "<<i<<endl; vis[x][i]=1; } } for(int i=y+1;i<=m;i++) { if(!vis[x][i]) { cout<<x<<" "<<i<<endl; vis[x][i]=1; } } int i; int ok=0; for(int j=m;j>=1;j--) { if(!ok) { i=n; for(;i>=1;i--) { if(!vis[i][j]) { cout<<i<<" "<<j<<endl; vis[i][j]=1; } } ok=1; } else { i=1; for(;i<=n;i++) { if(!vis[i][j]) { cout<<i<<" "<<j<<endl; vis[i][j]=1; } } ok=0; } } }
C:http://codeforces.com/contest/1395/problem/C
题意:
ci=ai&bj(j任意)
求最小的c1|c2|c3.....
解析:
a,b最大到2^9,那么c结果最大为2^10-1。
对于c1|c2|c3...== i ,有对于任意一个c,均有 i | ci==i
那么根据这个性质,枚举结果i,看对于每一个ai,是否均存在一个bj ,满足 i | (ai&bj)==i
#include<iostream> #include<map> #include<set> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=2e2+10; int a[maxn]; int b[maxn]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; for(int i=0;i<(1<<10);i++) { int ok1=0; for(int j=1;j<=n;j++) { int ok2=0; for(int c=1;c<=m;c++) { if((i|(a[j]&b[c]))==i) { ok2=1;break; } } if(!ok2) { ok1=1; break; } } if(!ok1) { cout<<i<<endl;return 0; } } }