後端架構師技術圖譜
阿新 • • 發佈:2020-08-14
Practice link:https://codeforces.ml/contest/1395
A. Boboniu Likes to Color Balls
思路:要構成迴文,就要至少有三個顏色的數量是偶數,那麼只需要判斷兩種情況,就是一個都不減的情況和 r g b 三種顏色減一,w 加一時的情況。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 1e9+7 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6View Code#define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 using namespace std; 10 const int NUM = 200005; 11 12 ll n,m; 13 int main() 14 { 15 int T; 16 scanf("%d",&T); 17 while(T--){18 int r,g,b,w; 19 cin>>r>>g>>b>>w; 20 if(r%2==1&&g%2==1&&b%2==1){ 21 cout<<"YES"<<endl; 22 }else{ 23 int sum=0; 24 if(r%2==1)sum++; 25 if(g%2==1)sum++; 26 if(b%2==1)sum++;27 if(w%2==1)sum++; 28 if(sum<=1){ 29 cout<<"YES"<<endl; 30 }else{ 31 sum=0; 32 if(r*g*b!=0){ 33 r--; 34 g--; 35 b--; 36 w+=3; 37 if(r%2==1)sum++; 38 if(g%2==1)sum++; 39 if(b%2==1)sum++; 40 if(w%2==1)sum++; 41 if(sum<=1){ 42 cout<<"YES"<<endl; 43 }else{ 44 cout<<"NO"<<endl; 45 } 46 }else{ 47 cout<<"NO"<<endl; 48 } 49 50 } 51 } 52 } 53 return 0; 54 }
B. Boboniu Plays Chess
思路:條件只有 可以向這個方格的相同行和相同列移動,且輸出沒有重複的格子,但沒有說一個格子只能經過一次,那麼題目就很簡單了,移動思路見下。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 1e9+7 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 using namespace std; 10 const int NUM = 200005; 11 12 int n,m,x,y; 13 int mp[105][105]; 14 int main() 15 { 16 mem(mp,0); 17 scanf("%d %d %d %d",&n,&m,&x,&y); 18 int num=0; 19 int px=x,py=1; 20 printf("%d %d\n",x,y); 21 mp[x][y]=++num; 22 for(int i=1;i<=m;i++){ 23 if(mp[px][py]==0){ 24 printf("%d %d\n",px,py); 25 mp[px][py]=++num; 26 } 27 py++; 28 } 29 py=m; 30 px--; 31 int xx=x*m; 32 while(num<xx){ 33 if(py==m){ 34 for(int i=m;i>=1;i--){ 35 printf("%d %d\n",px,i); 36 mp[px][i]=++num; 37 } 38 py=1; 39 px--; 40 }else{ 41 for(int i=1;i<=m;i++){ 42 printf("%d %d\n",px,i); 43 mp[px][i]=++num; 44 } 45 py=m; 46 px--; 47 } 48 } 49 px=x+1; 50 while(num<n*m){ 51 if(py==m){ 52 for(int i=m;i>=1;i--){ 53 printf("%d %d\n",px,i); 54 mp[px][i]=++num; 55 } 56 py=1; 57 px++; 58 }else{ 59 for(int i=1;i<=m;i++){ 60 printf("%d %d\n",px,i); 61 mp[px][i]=++num; 62 } 63 py=m; 64 px++; 65 } 66 } 67 return 0; 68 }View Code
C. Boboniu and Bit Operations
思路:由於答案的範圍很小,且兩個陣列也很小,那麼考慮暴力列舉答案即可,範圍是 0~(1<<9-1),從小到大列舉就可以保證答案最小,只需要該範圍內的某個 i 與 a 陣列中的所有數與 b 陣列中的某個數的或操作結果為 i 即可。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 1e9+7 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 10 using namespace std; 11 const int NUM = 200005; 12 13 inline int rd() { 14 int res = 0,flag = 0; 15 char ch; 16 if ((ch = getchar()) == '-')flag = 1; 17 else if(ch >= '0' && ch <= '9')res = ch - '0'; 18 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 19 return flag ? -res : res; 20 } 21 int n,m; 22 int a[205],b[205]; 23 int main() 24 { 25 n=rd(); 26 m=rd(); 27 for(int i=1;i<=n;i++){ 28 scanf("%d",&a[i]); 29 } 30 for(int i=1;i<=m;i++){ 31 scanf("%d",&b[i]); 32 } 33 for(int i=0;i<=(1<<9)-1;i++){ 34 int flag=1; 35 for(int j=1;j<=n;j++){ 36 int flag2=0; 37 for(int k=1;k<=m;k++){ 38 if((i|(a[j]&b[k]))==i){ 39 flag2=1; 40 break; 41 } 42 } 43 if(flag2==0){ 44 flag=0; 45 break; 46 } 47 } 48 if(flag){ 49 cout<<i<<endl; 50 return 0; 51 } 52 } 53 return 0; 54 }View Code
D. Boboniu Chats with Du
思路:資料不大,列舉使用大於 m 的數的數量,首先將小於等於 m 和大於 m 的數分別存入兩個陣列,在將兩個陣列從大到小排序,在求字首和,來保證每次列舉時的值最大,設 i 為大於 m 的值的數量,那麼 i 個數中有一個數一定要在末尾才可以保證值最大,因為它不會讓下面的數變成0,那麼 i 個大於 m 的數讓 (i - 1) * d 個數變成 0 ,則此時還有 min( x , n - (i - 1) * d - i )個 小於等於m的數,因此此時結果為 a[ i ] + b[ min( x , n - (i - 1) * d - i ) ] 。
還需要注意資料範圍,防止在運算過程是越界。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 1e9+7 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 10 using namespace std; 11 const int MAXN = 100005 ; 12 13 inline int rd() { 14 int res = 0,flag = 0; 15 char ch; 16 if ((ch = getchar()) == '-')flag = 1; 17 else if(ch >= '0' && ch <= '9')res = ch - '0'; 18 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 19 return flag ? -res : res; 20 } 21 int n,d,m; 22 ll a[MAXN]; 23 ll b[MAXN]; 24 bool cmp(ll x,ll y) 25 { 26 return x>y; 27 } 28 int main() 29 { 30 n=rd(); 31 d=rd(); 32 m=rd(); 33 ll z; 34 int x=0,y=0; 35 for(int i=1;i<=n;i++){ 36 scanf("%lld",&z); 37 if(z<=m)a[++x]=z; 38 else b[++y]=z; 39 } 40 sort(a+1,a+x+1,cmp); 41 sort(b+1,b+y+1,cmp); 42 for(int i=1;i<=x;i++)a[i]+=a[i-1]; 43 for(int i=1;i<=y;i++)b[i]+=b[i-1]; 44 ll ans=0; 45 for(int i=0;i<=y;i++){ 46 if(n-i<1ll*(i-1)*d)continue; 47 ll res=min((ll)x,(ll)n-i-(i-1)*d); 48 ans=max(1ll*a[res]+b[i],ans); 49 } 50 cout<<ans; 51 return 0; 52 }View Code