• Codeforces Round #648题解


    A题

    签到模拟题

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int g[55][55];
    int col[55];
    int row[55];
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n,m;
            cin>>n>>m;
            memset(col,0,sizeof col);
            memset(row,0,sizeof row);
            int i,j;
            for(i=1;i<=n;i++){
                for(j=1;j<=m;j++){
                    cin>>g[i][j];
                    if(g[i][j]){
                        col[i]=1;
                        row[j]=1;
                    }
                }
            }
            int cnt=0;
            for(i=1;i<=n;i++){
                for(j=1;j<=m;j++){
                    if(!g[i][j]){
                        if(!col[i]&&!row[j]){
                            cnt++;
                            col[i]=row[j]=1;
                            g[i][j]=1;
                        }
                    }
                }
            }
            if(cnt%2)
                cout<<"Ashish"<<endl;
            else{
                cout<<"Vivek"<<endl;
            }
        }
        return 0;
    }
    View Code

    B题

    排序比对

    #include<iostream>
    #include<queue>
    #include<map>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    const int mod=1e9+7;
    int a[N];
    int x[N];
    int b[N];
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            int i;
            for(i=1;i<=n;i++)
                cin>>a[i];
            for(i=1;i<=n;i++)
                cin>>x[i];
            int cnt1=0,cnt2=0;
            for(i=1;i<=n;i++){
                if(x[i]==0)
                    cnt1++;
                else
                    cnt2++;
            }
            if(cnt1&&cnt2){
                cout<<"YES"<<endl;
            }
            else{
                memcpy(b,a,sizeof a);
                sort(b+1,b+1+n);
                int sign=0;
                for(i=1;i<=n;i++)
                if(b[i]!=a[i]){
                    sign=1;
                    break;
                }
                if(!sign)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }
        }
    }
    View Code

    C题

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=6e5+10;
    int a[N];
    int b[N];
    int pos[N];
    int cnt[N];
    int main(){
        ios::sync_with_stdio(false);
        int n;
        cin>>n;
        int i;
        for(i=1;i<=n;i++){
            cin>>a[i];
            pos[a[i]]=i;
        }
        for(i=1;i<=n;i++){
            cin>>b[i];
        }
        for(i=1;i<=n;i++){
            int x=pos[b[i]];
            if(x>=i){
                cnt[x-i]++;
            }
            else{
                int tmp=n-i+1;
                cnt[x-1+tmp]++;
            }
        }
        //cout<<cnt[1]<<endl;
        sort(cnt,cnt+1+n);
        reverse(cnt,cnt+1+n);
        cout<<cnt[0]<<endl;
     
    }
    View Code

    D题

    如果好人和坏人挨在一起肯定不行

    否则讲坏人周围的一圈全部围起来,这样是最优的

    之后从n,m处看看能否经过所有的好人

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=6e5+10;
    char s[60][60];
    int dx[]={-1,0,1,0};
    int dy[]={0,1,0,-1};
    int vis[60][60];
    int res;
    int n,m;
    void dfs(int x,int y){
        int i;
        for(i=0;i<4;i++){
            int a=x+dx[i];
            int b=y+dy[i];
            if(a&&a<=n&&b&&b<=m&&(!vis[a][b])){
                if(s[a][b]=='#')
                    continue ;
                vis[a][b]=1;
                if(s[a][b]=='G'){
                    res++;
                }
                dfs(a,b);
            }
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--){
            memset(vis,0,sizeof vis);
            cin>>n>>m;
            int i,j;
            int gcnt=0;
            int sign=0;
            for(i=1;i<=n;i++){
                for(j=1;j<=m;j++){
                    cin>>s[i][j];
                }
            }
            for(i=1;i<=n;i++){
                for(j=1;j<=m;j++){
                    if(s[i][j]=='G')
                        gcnt++;
                    else if(s[i][j]=='B'){
                        int k;
                        //cout<<i<<" "<<j<<endl;
                        for(k=0;k<4;k++){
                            int a=i+dx[k];
                            int b=j+dy[k];//cout<<a<<" "<<b<<endl;
                            if(a&&a<=n&&b&&b<=m){
                                if(s[a][b]=='G'){
                                    sign=1;
                                    break;
                                }
                                else if(s[a][b]=='.'){
                                    s[a][b]='#';
                                }
                            }
                        }
                    }
                }
            }
            res=0;
            if(sign){
                cout<<"NO"<<endl;
                continue;
            }
            if(s[n][m]!='#'){
                vis[n][m]=1;
                dfs(n,m);
            }
            if(res==gcnt)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    View Code

    E题

    因为题目已知至少要k-2个

    假设我们取了k个,使得答案最大

    那么因为对于每个数来说至少k-2个数在这位是1

    因此我们只要任意选三个数,都能保证在每一位上都有至少一个数为1

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    ll a[N];
    int main(){
        int n;
        cin>>n;
        int i;
        for(i=1;i<=n;i++){
            cin>>a[i];
        }
        ll ans=0;
        if(n==1){
            cout<<a[1]<<endl;
        }
        else if(n==2){
            cout<<(a[1]|a[2])<<endl;
        }
        else{
          int j,k;
          for(i=1;i<=n;i++){
            for(j=i+1;j<=n;j++){
                for(k=j+1;k<=n;k++)
                    ans=max(ans,a[i]|a[j]|a[k]);
            }
          }
          cout<<ans<<endl;
        }
    
    
    }
    View Code
  • 相关阅读:
    k8s各个组件使用过程中的纪要
    lynis安装与使用
    在docker容器中使用sudo命令
    CAD文字双击后移位
    Centos 7 上 源码安装和配置 ATS 9.1.2
    《编程之美》2.2 不要被阶乘吓倒
    《编程之美》2.1 求无符号整数N的二进制表示中1的个数
    达梦数据库体系学习分享
    使用grabit分析mysql数据库中的数据血缘关系
    C++ 赋值运算符和拷贝构造函数
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14193880.html
Copyright © 2020-2023  润新知