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;
        }
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/13497950.html