• Codeforces Round #664 (Div. 2)(A->C)


    A:http://codeforces.com/contest/1395/problem/A

    题意:

    给出四种颜色球的数目。

    操作:前三个颜色的球各减一,变成第四种。

    是否能让所有球组成回文?

    解析:

    构成回文的条件:均为偶数或者只含一个奇数

    对于第四种球,如果被操作,就是+3

    可以发现,+3一次就能改变本身的奇偶性,+6奇偶性不变。所以,只操作一次,就能判断结果。

    先统计奇偶数,以及前三个为0的数目c0,如果本身就能构成回文,直接yes,否则,就在c0==0的情况下,操作一次再判断。

    #include<bits/stdc++.h>
    #define N 500009
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+10;
    const int mod=1e9+7;
    //char mp[maxn][maxn];
    int a[maxn];
    int b[maxn];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            ll a[12];
            cin>>a[1]>>a[2]>>a[3]>>a[4];
            int j=0,o=0;
            int c0=0;
            for(int i=1;i<=4;i++)
            {
                if(a[i]%2==0)
                    o++;
                else
                    j++;
                if(a[i]==0&&i<4)
                    c0++;
            }
            if(j==1||(o==4))
            {
                cout<<"Yes"<<endl;
            }
            else if(c0!=0)
            {
                cout<<"No"<<endl;
            }
            else
            {
                a[1]-=1;
                a[2]-=1;
                a[3]-=1;
                a[4]+=3;
                j=0;
                o=0;
                for(int i=1;i<=4;i++)
                {
                    if(a[i]%2==0)
                        o++;
                    else
                        j++;
                }            
                if(j==1||o==4)
                    cout<<"Yes"<<endl;
                else
                    cout<<"No"<<endl;
            }
        }
    }

    B:http://codeforces.com/contest/1395/problem/B

    题意:

    访问同一行或同一列可以跳着放,求访问所有点的顺序。

    解析:

    先将起点行左右跑一遍,然后蛇形跑每一列即可。

    #include<bits/stdc++.h>
    #define N 500009
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn=1e2+10;
    const int mod=1e9+7;
    int vis[maxn][maxn];
    //char mp[maxn][maxn];
    int a[maxn];
    int b[maxn];
    int main()
    {
    
        int n,m,x,y;
        memset(vis,0,sizeof(vis));
        cin>>n>>m>>x>>y;
        cout<<x<<' '<<y<<endl;
        vis[x][y]=1;
        for(int i=y-1;i>=1;i--)
        {
            if(!vis[x][i])
            {
                cout<<x<<" "<<i<<endl;
                vis[x][i]=1;
            }
        }
        for(int i=y+1;i<=m;i++)
        {
            if(!vis[x][i])
            {
                cout<<x<<" "<<i<<endl;
                vis[x][i]=1;
            }
        }
        int i;
        int ok=0;
        for(int j=m;j>=1;j--)
        {
            if(!ok)
            {
                i=n;
                    for(;i>=1;i--)
                {
                    if(!vis[i][j])
                    {
                        cout<<i<<" "<<j<<endl;
                        vis[i][j]=1;
                    }
                }
                ok=1;
            }
            else
            {
                i=1;
                for(;i<=n;i++)
                {
                    if(!vis[i][j])
                    {
                        cout<<i<<" "<<j<<endl;
                        vis[i][j]=1;
                    }
                }
                ok=0;
            }
        }
    }

    C:http://codeforces.com/contest/1395/problem/C

    题意:

    ci=ai&bj(j任意)

    求最小的c1|c2|c3.....

    解析:

    a,b最大到2^9,那么c结果最大为2^10-1。

    对于c1|c2|c3...== i ,有对于任意一个c,均有 i | ci==i

    那么根据这个性质,枚举结果i,看对于每一个ai,是否均存在一个bj ,满足 i |  (ai&bj)==i

    #include<iostream>
    #include<map>
    #include<set>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn=2e2+10;
    int a[maxn];
    int b[maxn];
    int main()
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=m;i++)
            cin>>b[i];
        for(int i=0;i<(1<<10);i++)
        {
            int ok1=0;
            for(int j=1;j<=n;j++)
            {
                int ok2=0;
                for(int c=1;c<=m;c++)
                {
                    if((i|(a[j]&b[c]))==i)
                    {
                        ok2=1;break;
                    }
                }
                if(!ok2)
                {
                    ok1=1;
                    break;
                }
            }
            if(!ok1)
            {
                cout<<i<<endl;return 0;
            }
        }
    }
  • 相关阅读:
    修复grub引导Centos8和Windows
    少儿编程到底学什么?
    Windows平台最方便最易用的法语输入法
    ServiceStack.OrmLite 入门(一)
    起步:Proteus 8 仿真 Arduino 1.8.2
    命令行方式登录PostgreSQL
    CentOS 7 安装 PostgreSQL
    Twitter开源的Heron快速安装部署教程
    centos7下使用yum安装mysql
    [转]centos7 下安装MongoDB
  • 原文地址:https://www.cnblogs.com/liyexin/p/13497950.html
Copyright © 2020-2023  润新知