Codeforces Round #664 (Div. 2)(A->C)
阿新 • • 發佈:2020-08-13
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 usingnamespace 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; intc0=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; } elseif(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; } } }