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

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    vue.js 系列教程
    vue.js 生命周期
    MVVM代码例子
    vue.js windows下开发环境搭建
    Vue.js 之修饰符详解
    elementUi——适合于Vue的UI框架
    Vue.js——60分钟快速入门
    Keil sct分散加载文件
    Keil ARM-CM3 printf输出调试信息到Debug (printf) Viewer
    Cortex-M3(NXP LPC 1788) 启动代码
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10277155.html
Copyright © 2020-2023  润新知