B. Curiosity Has No Limits cf1072(div2)

对于上面下面两个数字一旦确定,他们的解就确定了。所以可以4*4枚举头两个数字的所有可能,定下第二个数字,后面的数字就能一个个定下来。如果有一种能满足题意的结果就输出

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
int a[100010];
int b[100010];
vector<int> vec;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d",&b[i]);
    }
    for(int i=1;i<=n-1;i++)
    {
        if(a[i]==2&&b[i]==1||a[i]<b[i])
        {
            printf("NO\n");
            return 0;
        }
    }
    for(int i=0;i<=3;i++)
    {
        for(int j=0;j<=3;j++)
        {
            if((i|j)==a[1]&&(i&j)==b[1])
            {
                vec.clear();
                vec.push_back(i);
                vec.push_back(j);
                int k=2;
                for(;k<=n-1;k++)
                {
                    int last=*(vec.end()-1);
                    bool flag=false;
                    for(int index=0;index<=3;index++)
                    {
                        if( (index|last)==a[k]&&(index&last)==b[k] )
                          vec.push_back(index),flag=true;;//index是确定的,暴力是为了求值 
                    }
                    if(!flag)
                      break;
                }
                if(k==n)
                {
                    printf("YES\n");
                    for(int l=0;l<vec.size();l++)
                       printf("%d ",vec[l]);
                    printf("\n");
                    return 0;
                }
            }
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/lishengkangshidatiancai/p/10328464.html