给出一个四个规则
0->0=1 0->1=1
1->0=0 1->1=0
我自己当时一味的去找规律,没有把式子好好推一推。
当然每个人都能想到a[n]=0是必须的
当a[n-1]=1的时候,直接输出即可,因为前面无论到0还是1,最后与n-1结合都是1,而这正式我们需要的
那么问题来了,a[n-1]=0时,我们该如何操作呢?
思考这样我们以及知道的条件,考虑某一段010101010000111....1,只要是以1为结尾的,按顺序计算都是1。
再思考如何有两个0,我们发现(0(111...0))这个式子是恒等于1的,无论中间1是多少个,而只要这等于1后,无论(0(111...0))的前面位置按顺序计算是什么,答案都是1,然后再和0计算,答案就是0
反思:自己思考的时候,一味的僵化,没有把式子进行本质扩展和分析。同时脑子很乱,对于这种思维题,是大忌
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<map> #define LL long long using namespace std; int a[100005]; int main() { int n; while(~scanf("%d",&n)) { for (int i=1; i<=n; i++) { scanf("%d",&a[i]); } if (n==1) { if(a[1]==0) { printf("YES\n0\n"); } else { printf("NO\n"); } } else if (n==2) { if (a[1]==1 && a[2]==0) { printf("YES\n1->0\n"); } else { printf("NO\n"); } }else if (a[n]==1){ printf("NO\n"); } else { if (a[n-1]==1) { printf("YES\n"); for (int i=1; i<=n; i++) { if (i-1) { printf("->"); } printf("%d",a[i]); } printf("\n"); } else { int pos=-1; if (a[n]==0) { for (int i=n-2; i>=1; i--) { if (a[i]==0) { pos=i; break; } } if (pos==-1) { printf("NO\n"); continue; } printf("YES\n"); for (int i=1; i<pos; i++) { printf("%d->",a[i]); } printf("(0->("); for (int i=pos+1; i<=n-2; i++) { printf("%d->",a[i]); } printf("0))->0\n"); } else { printf("NO\n"); } } } } return 0; }