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