zoukankan      html  css  js  c++  java
  • 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
    0
    ");
                }
                else
                {
                    printf("NO
    ");
                }
            }
            else if (n==2)
            {
                if (a[1]==1 && a[2]==0)
                {
                    printf("YES
    1->0
    ");
                }
                else
                {
                    printf("NO
    ");
                }
            }else if (a[n]==1){
               printf("NO
    ");
            }
            else
            {
                if (a[n-1]==1)
                {
                    printf("YES
    ");
                    for (int i=1; i<=n; i++)
                    {
                        if (i-1)
                        {
                            printf("->");
                        }
                        printf("%d",a[i]);
                    }
                    printf("
    ");
                }
                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
    ");
                            continue;
                        }
                         printf("YES
    ");
                        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
    ");
                    }
                    else
                    {
                        printf("NO
    ");
                    }
                }
            }
    
        }
        return 0;
    }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    查找(二)简单清晰的B树、Trie树具体解释
    Java模式(适配器模式)
    程序猿生存定律--交换是职场里一切的根本
    list C++实现
    腾讯面试
    Android4.2.2启动动画前播放视频
    cocos2d0基础篇笔记一
    String.Split()函数
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    [一个互联网思想信徒]:今天突破69个听众
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10432867.html
Copyright © 2011-2022 走看看