1. 程式人生 > 實用技巧 >軟體工程

軟體工程

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))  
 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 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 }
View Code

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