CodeForces 550E Brackets in Implications(构造)

来源:互联网 发布:903 电台 mac 播放 编辑:程序博客网 时间:2024/06/01 08:37

题目链接】:click here~~

题目大意】给定一个逻辑运算符号a->b:当前仅当a为1b为0值为0,其余为1,构造括号,改变运算优先级使得最后结果为0

解题思路】:

todo~~

/*
思路:
1.如果最后一位是1,无论如何结果不会为0.puts("NO");
2.那么有解的情况下最后一位必为0
  2.1.进一步发现,其实倒数第二位必为1,只有1前面的结果和该位1结合才能等于1,进一步1->0=0;
  2.2.如果1前面是0,那么合并这两位数,组成1,递推2.1
*/

代码:

#include <bits/stdc++.h>using namespace std;const int N=1e5+10;typedef long long LL;typedef unsigned long long  LLU;int num[N];int n,m,l,r,ans,cnt,top;int zero,one;int main(){    while(cin>>n)    {        zero=one=0;        for(int i=0; i<n; ++i)        {            scanf("%d",&num[i]);            if(num[i]==0) ++zero;            else ++one;        }        int a3=num[n-1];        int a2=num[n-2];        int a1=num[n-3];        if(a3==0&&(a2==1||zero!=2))//保证最后一位是0,倒数第二位是1        {            puts("YES");            printf("(");            for(int i=0; i<=n-3; ++i)            {                printf("(%d->",num[i]);            }            printf("%d",a2);            for(int i=0; i<=n-3; ++i)                printf(")");            if(n-1) printf("->0");            printf(")");            puts("");        }        else puts("NO");    }    return 0;}


0 0