一开始看题目的时候还觉得特别简单,甚至不想动手开始写,后来还是自己尝试快点 写完之后才发现自己有许多粗心的地方,这种毛病在比赛中可是致命的,所以大家看见一些本以为很简单的题目,还是敲一敲,就当作训练自己的速度吧
自己一些错的地方放在注释里面,也供自己以后回顾了。
#include<iostream>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
int a[35];
int check_(int a[],int k) {
int b[35];
int len = k;
for (int i = 0; i < len; ++i) {
b[i] = a[i];
}
sort(b, b + len);
for (int i = 0; i < len; ++i) {
if (b[i] != a[i]) return 0;
}
return 1;
}
void change(int n) {
if(n==0) return ;
int b[35];
int i = 0;
for (int k = n; k>=0; --k) {
b[i++] = a[k];
}
for (int k = 0; k <= n; ++k) {
a[k] = b[k];
}
}
int findmax(int a[], int n) {
int max = a[0];
int k = 0;
for (int i = 0; i < n; ++i) {
if (max < a[i]) {
max = a[i];
k = i;
}
}
return k;
}
int main() {
int i;
string s;
while (getline(cin, s)) {
int k = s.size();
i = 0;
for (int j = 0; j < k; ++j) {
a[i]=0;
while (s[j] != ' '&&j<k) {
a[i] =a[i]*10+ s[j]-'0'; //这里要注意可能不止1位数
j++;
}
++i;
}
for(int j=0;j<i;++j){
if(j!=i-1) cout<<a[j]<<" ";
else cout<<a[j]<<endl;
}
int count = i;
int h = i;
int p = 1;
while (h >=1) {
if (check_(a,h)) {
cout << "0"<<endl;
break;
}
int index_max = findmax(a, h);
if(index_max==h-1){ //要考虑本来就在符合的位置的情况,就跳过
h--;
p++; //一开始没写这个。
continue;
}
if (index_max == 0) cout << p++ << " ";
else cout << count - index_max <<" "<<p++<<" ";
change(index_max);
change(h-1);
h--;
}
}
return 0;
}