NJUPT校赛E题(思维)

题意:n表示数的个数,输入n,再输入n个数。然后一个数向后移动一位那么这个数减1,一个数向前移动一位,那么这个数加1.
问能否生成一个单调递增的数列,能输出生成的数列。不能输出NO。

题意分析:
比赛的时候收到题目名字的影响,冒泡排序,可是这题的思路和冒泡排序没什么关系。
想法是这样的,可以想象是是一个楼梯。向右边移动一位实际上相当于下一层楼梯,向左移动相当于上一级楼梯。可以算出每一个位置的实际高度(a[i]-n-1),然后排序,再加上相应的高度,就可以得到正确的结果。
这里写图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
typedef long long ll;
ll a[3000],b[3000],n;
int flag=1;
void print(){
    flag=1;
    for(int i=0;i<n-1;i++){
        if(b[i]>=b[i+1]){ flag=0;}
    }
        if(flag) {
            cout<<"YES"<<endl;
            for(int i=0;i<n;i++){
                cout<<b[i];
                if(i!=n-1) cout<<" "; 
                else cout<<endl;
            }
        }
        else{
            cout<<"NO"<<endl;
        }       
} 
int main(){
    while(cin>>n){
        memset(a,0,sizeof(a)); 
        for(int i=0;i<n;i++){
            cin>>a[i];
            b[i]=a[i];
            b[i]=b[i]-(n-i-1);
        }
        sort(b,b+n);
        for(int i=0;i<n;i++){
            b[i]+=(n-i-1);
        }
        print();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/80042640