题目大意:
运算法则如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7ab40bd0e7e80d69d572996110a2b09a.png)
现在给出n个数字,问有没有方法使得最终的结果为0,没有输出NO,否则输出YES,并输出表达式;
思路分析:
①:当只有一个数字的时候,1为NO,0为YES;
②:当最后一个数字为1,为NO;
③:最后两个数字为0,前面全部为1的情况下为NO;
④:最后两个数字为0,前面不全部为1的情况,输出YES,在第一个为0的数字后加“(”,倒数第二个数字后加“)”,保证最后一个数字为0,前面表达式结果为1,例如:1 0 1 1 1 0 0 输出为:1->0->(1->1->1->0)->0 ;
⑤:最后两个数字为1 0,为YES,不加括号,直接输出;
代码实现:
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int num[N];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;++i) scanf("%d",&num[i]);
if(n==1){
if(num[0]==1) printf("NO\n");
else if(num[0]==0) printf("YES\n0\n");
continue;
}
int sum=0;
for(int i=0;i<n-2;++i) sum+=num[i];
if(num[n-1]==1||(sum==n-2&&num[n-1]==0&&num[n-2]==0)){
printf("NO\n");
continue;
}
if(num[n-2]==1&&num[n-1]==0){
printf("YES\n");
printf("%d",num[0]);
for(int i=1;i<n;++i) printf("->%d",num[i]);
printf("\n");
continue;
}
if(num[n-2]==0&&num[n-1]==0){
printf("YES\n");
int flag;
for(int i=0;i<n-2;++i){
if(num[i]==0){
flag=i;
break;
}
}
flag++;
printf("%d",num[0]);
for(int i=1;i<n;++i){
if(flag==i) printf("->(");
else if(i==n-1) printf(")->");
else printf("->");
printf("%d",num[i]);
}
printf("\n");
}
}
}