1.题目描述:点击打开链接
2.解题思路:本题利用贪心法解决,按照题意,可以先复制原队列,并排好序,从大到小以此把每个数排到正确位置,方法是:先翻到上面,再翻到正确位置,每翻一次,都要判断队列是否已经排好,如果本来就在最顶层,或局部和排过序的队列相同,可以跳过,无需翻转
3.代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn = 30 + 10; int a[maxn], r[maxn]; int maxd, pos, cnt; bool is_ok(int cnt, int*a) { for (int i = 0; i < cnt; i++) if (a[i] != r[i])return false; return true; } void invert(int start)//将0到start之间的数翻转 { int temp[maxn]; memcpy(temp, a, sizeof(int)*(start + 1)); for (int i = 0; i <= start; i++) a[i] = temp[start - i]; } void solve(int end, int m) { int ok = 0; for (int i = end; i >= 0; i--) { if (a[i] == m)//找到m的位置 { ok = 1; if (i)//如果是最顶层,无需翻转 { printf("%d ", cnt - i); invert(i); } if (!is_ok(cnt, a) && end)//如果没有排好或没有扫描到最顶层 { printf("%d ", cnt - end); invert(end); } else break; } if (ok)break; } } int main() { string str; while (getline(cin, str)) { cnt = 0; maxd = 0; memset(a, 0, sizeof(a)); memset(r, 0, sizeof(r)); stringstream ss(str); int tmp; while (ss >> tmp) { a[cnt]=tmp; if (a[cnt] > maxd) { maxd = a[cnt]; pos = cnt; } cnt++; } for (int i = 0; i < cnt; i++) printf("%d%c", a[i], i == cnt - 1 ? '\n' : ' '); memcpy(r, a, sizeof(a)); sort(r, r + cnt); for (int i = cnt - 1; i >= 0; i--)//按照从大到小顺序一个个处理 if (a[i] == r[i])continue;//局部相同,跳过 else if (!is_ok(cnt, a))solve(i, r[i]); printf("0\n"); } return 0; }
另外,我找到了一份很随性的STL代码,供参考学习
#define _CRT_SECURE_NO_WARNINGS #include<bits/stdc++.h> using namespace std; int main() { string str; for(;getline(cin,str);cout<<0<<endl) { cout<<str<<endl; istringstream iss(str); deque<int> a; for(int i;iss>>i;a.push_front(i)); for(deque<int>::iterator i=a.begin();i!=a.end();++i) { deque<int>::iterator Max=max_element(i,a.end()); if(Max!=i) { if(Max!=a.end()-1) { reverse(Max,a.end()); cout<<distance(a.begin(),Max)+1<<" "; } reverse(i,a.end()); cout<<distance(a.begin(),i)+1<<" "; } } } return 0; }