• AIM Tech Round 5 (rated, Div. 1 + Div. 2) E(思维,构造)


    #include<bits/stdc++.h>
    using namespace std;
    long long a[150007];
    long long ans[150007];
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        int flag=0;
        for(int i=2;i<=n;i++){
            if(a[i]!=a[i-1]){//全部一样且并不全为0则无答案
                flag=1;
                break;
            }
        }
        int cnt=0;
        for(int i=1;i<=n;i++){
            if(a[i]==0)
                cnt++;
        }
        if(cnt==n){
            printf("YES ");
            for(int i=1;i<=n;i++)
                printf("1 ");//都是零让答案一样即可,此处选择全部输出1
            return 0;
        }
        if(!flag)
            printf("NO");
        else{
            printf("YES ");
            long long mx=0;
            for(int i=1;i<=n;i++){
                if(a[i]>mx)
                    mx=a[i];
            }
            //printf("%d ",mx);
            if(a[1]==mx&&a[1]>a[n])
                flag=1;
            for(int i=2;i<=n;i++){
                if(a[i]==mx&&a[i]>a[i-1])
                    flag=i;//找到最后一个最大值并且a[i]>a[i-1]开始递推
            }
            if(flag==n){
                ans[flag]=a[flag];
                ans[flag-1]=ans[flag]*2+a[flag-1];//不*2的情况给出一组反例例如3    0 1 0 则output1 1 1 *2后output2 1 2就避免了最大值对后面的值%时出现<=的情况
                for(int i=flag-2;i>=1;i--){
                    ans[i]=ans[i+1]+a[i];//根据观察构造的函数
                }
                for(int i=1;i<=n;i++)
                    printf("%lld ",ans[i]);
            }
            else if(flag!=1){//类似上一个if
                ans[flag]=a[flag];
                ans[flag-1]=ans[flag]*2+a[flag-1];
                for(int i=flag-2;i>=1;i--){
                    ans[i]=ans[i+1]+a[i];
                }
                ans[n]=ans[1]+a[n];
                for(int i=n-1;i>flag;i--){
                    ans[i]=ans[i+1]+a[i];
                }
                for(int i=1;i<=n;i++)
                    printf("%lld ",ans[i]);
            }
            else if(flag==1){//类似上一个if
                ans[flag]=a[flag];
                ans[n]=ans[1]*2+a[n];
                for(int i=n-1;i>=2;i--){
                    ans[i]=ans[i+1]+a[i];
                }
                for(int i=1;i<=n;i++)
                    printf("%lld ",ans[i]);
            }
        }
        return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    tomcat遇到版本问题
    自定义文件上传的按钮的样式css+js
    js控制Bootstrap 模态框(Modal)插件
    jQuery-DataTables相关的网址
    在页面的el表达式是如何判断null的
    hibernate- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
    apache.commons.compress 压缩,解压
    maven项目project facets中是2.3调整为3.0的解决办法
    eclipse中启动调试maven构建的javaweb项目
    [转]事务传播
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10277155.html
Copyright © 2020-2023  润新知