1. 程式人生 > 實用技巧 >Codeforces Round #664 (Div. 2)(A->C)

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;
        }
    }
}