• 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(添加时记得备注)
  • 相关阅读:
    不用内置函数,实现字符串的反转
    selenium2学习:浏览器控制、简单操作、鼠标事件和键盘事件、获得验证信息、设置元素等待
    selenium2学习:浏览器操作:单元素定位&一组元素定位
    selenium2学习:webdriver:打开浏览器
    selenium2学习:python3基础
    selenium2学习:环境搭建
    selenium2学习:自动化测试基础知识
    zk实现分布式锁
    JDBC连接MySql,配置url报错
    git使用
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10432867.html
Copyright © 2020-2023  润新知