您的位置:首页 > 其它

Codeforces Round #306 (Div. 2) -- E. Brackets in Implications

2015-06-07 11:53 477 查看
题目大意:

运算法则如下:









可以添加()改变最终的结果,例如:

.
现在给出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
;

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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: