第八章真是严肃活泼的算法设计
试着读原题真是跪了,就是个摊煎饼问题却要扯一大堆有的没的
算法还是挺好想的,先把最大的翻到最上面,再连锅翻过来,最大的就到最底下了。之后就可以不用管这个煎饼了。
不过对于当前最大煎饼的位置要分类讨论:如果已经在最底下就什么也不做,如果已经在最顶上就直接连锅翻,如果在中间则需要按照上面的方法翻两次。
Run Time: 0.012s
#define UVa "LT8-1.120.cpp"
char fileIn[30] = UVa, fileOut[30] = UVa;
#include<cstring>
#include<cstdio>
#include<vector>
#include<sstream>
#include<algorithm>
using namespace std;
//Global Variables. Reset upon Each Case!
char line[100000];
/
int flip(vector<int>& v, int p) {
int n = v.size();
for(int i = 0; i <= (n-1-p)/2; i ++) {
swap(v[i+p],v[n-1-i]);
}
}
void print_vec(vector<int>& v) {
for(int i = 0; i < v.size(); i ++) {
if(i) printf(" ");
printf("%d", v[i]);
}
printf("\n");
}
int main() {
while(gets(line)) {
vector<int> pancakes;
vector<int> act;
int a;
string str(line);
stringstream ss(str);
while(ss>>a) {
pancakes.push_back(a);
}
print_vec(pancakes);
vector<int> order = pancakes;
sort(order.begin(), order.end());
for(int i = 0; i < pancakes.size()/2; i ++) {
swap(pancakes[i], pancakes[pancakes.size()-1-i]);
swap(order[i], order[order.size()-1-i]);
}
int j;
for(int i = 0; i < pancakes.size(); i ++) {
int m = order[i];
if(pancakes[i] == m) continue;
for(j = pancakes.size()-1; j >= i ; j --) if(pancakes[j] == m) break;
if(j != pancakes.size()-1) {
flip(pancakes, j);
act.push_back(j+1);
}
flip(pancakes, i);
act.push_back(i+1);
}
act.push_back(0);
print_vec(act);
}
return 0;
}