这个题没什么算法,就是想出怎么把答案构造出来就行。
思路:越大的越放在底端,那么每次就找出还没搞定的最大的,把它移到当前还没定好的那些位置的最底端,定好的就不用管了。
这道题要处理好输入,每次输入的一行中是带空格的,以换行符结束一组数据的输入,那么用getline()函数。再用stringstream(这个可以自动转格式),非常方便的就处理了输入的问题。另外注意max_element和min_element都是左闭右开的。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<stack> #include<queue> #include<cctype> #include<sstream> using namespace std; #define INF 1000000000 #define eps 1e-8 #define pii pair<int,int> #define LL long long int #define maxn 100010 int a[39],n; string s; void flip(int p) { for(int i=0;i<p-i;i++)//这里循环结束条件的设定有韵味 { swap(a[i],a[p-i]); } printf("%d ",n-p); } int main() { //freopen("in8.txt","r",stdin); //freopen("out.txt","w",stdout); while(getline(cin,s)) { cout<<s<<endl; stringstream ss(s); n=0; while(ss>>a[n]) n++; for(int i=n-1;i>=1;i--) { int p=max_element(a,a+i+1)-a; if(p==i) continue; else if(p>0) flip(p); flip(i); } cout<<'0'<<endl; } //fclose(stdin); //fclose(stdout); return 0; }