题目链接:http://codeforces.com/problemset/problem/550/E
题目大意:
给n个数,根据“->”规则构造结果为0的表达式。
题目思路:
“->”运算 以下统称 运算
考虑到只有1->0才会出现0,所以n个数最后一定是两大项运算,并且左边为1,右边为0,对于右边又分成一个1一个0,所以最后一个数字一定是0才能最终结果为0。
假如现在最后一个是0了,那么倒数第二个可以是1,也可以是0,如果是1的话我让倒数第二个前边的随便运算,不管结果为多少,和最倒数第二个的1 运算那么除了最后一个0,前边的一大堆就构造出一个1,在和最后的0运算得到0.
假如倒数第二个是0,那么还得看倒数第三个,倒数第三个如果是0,让到数第三个和倒数第二个运算构造出1,前边的随意,得到0。
那么到了最复杂的情况,倒数第三个如果是1怎么办,如果到数第三个是1,并且之前的全部是1,那么无论怎么构造。最后一个0之前也出不来1,只要倒数第三个之前出现一个0,就可以让0和下一个1构造出1,然后就出来1了,前边的随意。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<stdio.h>
#include<cmath>
#define ll long long
using namespace std;
const ll MAXN=100005;
int C[MAXN];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>C[i];
}
if(C[n]){
cout<<"NO"<<endl;return 0;
}
if(n==1){
if(C[1]==0)cout<<"YES"<<endl<<0<<endl;
else cout<<"NO"<<endl;
return 0;
}
if(n==2){
if(C[1]==1&&C[2]==0)
{cout<<"YES"<<endl;cout<<"(1->0)"<<endl;return 0;}
else {cout<<"NO"<<endl;return 0;}
}
if(C[n-1]==1){
cout<<"YES"<<endl;
for(int i=1;i<=n-1;i++){
cout<<C[i]<<"->";
}
cout<<0<<endl;
}
else{
if(C[n-2]==0){
cout<<"YES"<<endl;
for(int i=1;i<=n-3;i++){
cout<<C[i]<<"->";
}
cout<<"(0->0)->0"<<endl;
}
else{
int index=-1;
for(int i=n-3;i>=1;i--){
if(C[i]==0){index=i;break;}
}
if(index==-1){
cout<<"NO"<<endl;return 0;
}
cout<<"YES"<<endl;
for(int i=1;i<=index-1;i++){
cout<<C[i]<<"->";
}
cout<<"("<<C[index]<<"->(";
for(int i=index+1;i<=n-2;i++){
cout<<C[i]<<"->";
}
cout<<"0))->0"<<endl;
}
}
}