CodeForces 550E Brackets in Implications 推理

  给出一个四个规则

  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;
}

 

posted @ 2019-02-25 19:34  bluefly-hrbust  阅读(167)  评论(0编辑  收藏  举报