• Codeforces Round #664 (Div. 2)(A B C D)


    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
    ",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
    ",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
    ",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
    ",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
    ",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
    ",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
    越自律,越自由
  • 相关阅读:
    课程总结
    java实训作业----IO流
    6月11日数据结构——Huffman树
    6月10日数据结构——堆
    数据结构二叉树(实训报告)
    数据结构树(二叉树的使用)
    Java窗体的应用
    java监听、抛出异常
    数据结构顺序字符串(插入、删除、查找、BF模式匹配)
    数据结构顺序字符串
  • 原文地址:https://www.cnblogs.com/ha-chuochuo/p/13510346.html
Copyright © 2020-2023  润新知