UVA 120 Stacks of Flapjacks (模拟+贪心)
2016-05-31 22:44
399 查看
题意:烙煎饼,给最多30个煎饼,每个煎饼对应一个数字,数字的序列可能是无序的,每个煎饼对应的编号是n~1(换句话说,第一个煎饼的编号是n,以此类推),你可以做这种操作:选取一个煎饼k,可以使得k~n之间的煎饼反转。最终经过多次这种操作使得煎饼的数字排列是升序的,要求输出先后选取的所有的k值
注意给的数字可能是重复的
代码如下:
注意给的数字可能是重复的
代码如下:
#include<iostream> #include<sstream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; char str[35]; int a[35]; int k; int findMax(int endPos) { int pos=1,maxx=a[1]; for(int i=2; i<=endPos; i++) if(a[i]>=maxx) pos=i,maxx=a[i]; return pos; } bool pan() { int s=a[1]; for(int i=2; i<k; i++) if(a[i]<s) return false; return true; } void iReverse(int len) { for(int i=1; i<=len/2; i++) { int t; t=a[i],a[i]=a[len-i+1],a[len-i+1]=t; } } int main() { vector<int> road; memset(str,0,sizeof(str)); while(gets(str)) { road.clear(); k=1; int x; stringstream s(str); while(s>>x) a[k++]=x; int lim=k-1; while(true) { int maxPos=findMax(lim); if(maxPos!=lim) { if(maxPos!=1) { road.push_back(k-maxPos); iReverse(maxPos); } if(pan()) break; road.push_back(k-lim); iReverse(lim); } lim--; } printf("%s\n",str); if(!road.empty()){ cout<<road[0]; for(int i=1; i<road.size(); i++) cout<<" "<<road[i]; cout<<" "<<"0"<<endl;} else cout<<"0"<<endl; memset(str,0,sizeof(str)); } }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?