题意: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;
}