【题目链接】: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; }