Codeforces Round #784 (Div. 4) ,CF全新第一把div4体验&题解

举报
小哈里 发表于 2022/05/06 00:37:28 2022/05/06
【摘要】 文章目录 A. DivisionB. TripleC. Odd/Even IncrementsD. Colorful StampE. 2-Letter StringsF. Eating Candi...

不愧是div4, 打完还有一个多小时()

A. Division

  • ifelse判断就行
#include<bits/stdc++.h>
using namespace std;

int main(){
    int T;  cin>>T;
    while(T--){
        int x;  cin>>x;
        int t;
        if(x <= 1399)t = 4;
        else if(x <= 1599)t = 3;
        else if(x <= 1899)t = 2;
        else t = 1;
        cout<<"Division "<<t<<"\n";
    }
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

B. Triple

  • 找出数组中出现次数大于3的数字,直接map统计就行
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n;  cin>>n;
        map<int,int>ma;
        for(int i = 1; i <= n; i++){
            int x;  cin>>x;
            ma[x]++;
        }
        int cc = -1;
        for(auto t : ma){
            if(t.second>=3){
                cc = t.first;
                break;
            }
        }
        cout<<cc<<"\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

C. Odd/Even Increments

  • 每次操作可以给所有下标偶数或下标奇数的数+1,求能否让序列奇偶性都一样
  • 判断下标奇,偶的数字的奇偶性是否分别相同即可
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)

int a[110];

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n;  cin>>n;
        for(int i = 1; i <= n; i++){
            cin>>a[i];
        }
        int ok = 1;
        for(int i = 3; i <= n; i+=2){
            if(a[i]%2 != a[i-2]%2){ok = 0; break;}
        }
        for(int i = 4; i <= n; i+=2){
            if(a[i]%2 != a[i-2]%2){ok = 0; break;}
        }
        if(ok)cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

D. Colorful Stamp

  • 初始全部W,每次可以RB或者BR,求最后能否构造出给出的串
  • 可以发现RBRBRB或BRBRBR重叠盖一个,可以构造出任何的串,除非整个串都是R或者都是B才出不来。所以拿W作分界判断中间的RB串是否出现两个字母即可
  • 开始特判了1是NO,然而W也可以,调了好久。
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)

int a[110];

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n;  cin>>n;
        string s;  cin>>s;
        if(s.size()==1){
            if(s[0]=='W')cout<<"YES\n";
            else cout<<"NO\n";
            continue;
        }
        int ok = 1;
        int x = 0, y = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i]=='W'){
                if(x+y==1){
                    ok = 0; 
                }
                x = 0, y = 0;
            }else{
                if(s[i]=='R')x=1;
                else y = 1;
            }
        }
        if(x+y==1)ok = 0;
        if(ok)cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

E. 2-Letter Strings

  • 给出n个长为2的字符串,判断能构造多少对,满足只有一个字母位置不同
  • 对于当前串,考虑前面只有一个位置不同的个数,累加即可。
  • 注意开ll,不然会wa
#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
typedef long long LL;

LL a[110];

int main(){
    IOS;
    LL T;  cin>>T;
    while(T--){
        LL n;  cin>>n;
        map<string, LL>ma;
        map<char,LL>m1, m2;
        LL ans = 0;
        for(LL i = 1; i <= n; i++){
            string s;  cin>>s;
            LL t = m1[s[0]]+m2[s[1]]-2*ma[s];
            // cout<<"ttt: "<<s[0]<<" "<<s[1]<<" "<<ma[s]<<" "<<t<<"\n";
            ans += t;
            ma[s]++;
            m1[s[0]]++;
            m2[s[1]]++;
        }
        cout<<ans<<"\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

F. Eating Candies

  • 两个人分别从左右往中间拿糖果,且他们糖果数必须一样,求最多可以拿多少糖果
  • 双指针模拟即可
#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
typedef long long LL;
const int maxn = 2e5+10;

int a[maxn];

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n;  cin>>n;
        for(int i = 1; i <= n; i++)cin>>a[i];
        int l = 1, r = n;
        int lsum = 0, rsum = 0, ans = 0;
        while(l <= r){
            if(lsum <= rsum)lsum += a[l++];
            else rsum += a[r--];
            if(lsum == rsum)ans = l+(n-r-1);
        }
        cout<<ans<<"\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

G. Fall Down

  • 给出一个由*,o,.构成的矩阵,*会往下掉,除非遇到o或者叠满了,求最后的效果
  • 暴力模拟即可,每次数有几个直到遇到o,然后o往上都暴力修改一下。
#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
typedef long long LL;
const int maxn = 2e5+10;

string a[70];

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n, m;  cin>>n>>m;
        for(int i = 0; i < n; i++)cin>>a[i];
        for(int j = 0; j < m; j++){
            int c = 0;
            for(int i = 0; i < n; i++){
                if(a[i][j]=='*'){
                    c++;  a[i][j] = '.';
                }else if(a[i][j]=='o'){
                    for(int k = i-c; k < i; k++){
                        a[k][j] = '*';
                    }
                    c = 0;
                }
            }
            if(c){
                for(int k = n-c; k < n; k++){
                    a[k][j] = '*';
                }
                c = 0;
            }
        }
        for(int i = 0; i < n; i++)cout<<a[i]<<"\n";
        cout<<"\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

H. Maximal AND

  • 给出n个数,可以操作k次,每次可以把一个数的一个二进制位改为1,求最后n个数AND起来最大是多少
  • 从最高位往下枚举,如果当前位0的个数<k,那么就把他们都变成1,用掉相应操作次数,直到不能操作即可。
#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
typedef long long LL;
const int maxn = 2e5+10;

int a[35];

int main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        int n, k;  cin>>n>>k;
        memset(a,0,sizeof(a));
        for(int i = 1; i <= n; i++){
            int x;  cin>>x;
            for(int j = 30; j >= 0; j--){
                if((x>>j)&1 == 1)a[j]++;
            }
        }
        int ans = 0;
        for(int j = 30; j >= 0; j--){
            // cout<<a[j]<<' ';
            int t = n-a[j];
            if(k >= t){
                k -= t;
                ans += (1<<j);
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/124518785

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。