Stacks of Flapjacks UVA - 120
调了好久,orz
题解:以从大到小的顺序,先把大的翻到最上面,然后再翻回它应该在的位置(即从小到大的排序中的位置),不懂的话拿笔模拟这个过程就明白了。
注意读入的方法!!!坑了好久
1 #include<queue> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<sstream> 6 #include<iostream> 7 #include<algorithm> 8 using namespace std; 9 10 const int maxn=1005; 11 12 int d[maxn],b[maxn]; 13 14 int main() 15 { string s; 16 while(getline(cin,s)){ 17 priority_queue<int,vector<int>,less<int> > qmax; 18 stringstream ss(s); 19 cout<<s<<endl; 20 int cnt=0; 21 while(ss>>d[cnt]) cnt++; 22 for(int i=0;i<cnt;i++){ 23 b[i]=d[i]; 24 qmax.push(d[i]); 25 } 26 sort(b,b+cnt); 27 28 int i,j; 29 while(qmax.size()){ 30 int tem=qmax.top(); 31 qmax.pop(); 32 33 for(i=0;i<cnt;i++) if(d[i]==tem) break; 34 for(j=0;j<cnt;j++) if(b[j]==tem) break; 35 if(i==j) continue; 36 if(i!=0){ 37 cout<<cnt-i<<" "; 38 for(int k=0;k<=i/2;k++) swap(d[k],d[i-k]); 39 } 40 cout<<cnt-j<<" "; 41 for(int k=0;k<=j/2;k++) swap(d[k],d[j-k]); 42 } 43 cout<<"0"<<endl; 44 } 45 }