UVa #120 Stacks of Flapjacks (例题8-1)

86 篇文章 0 订阅

第八章真是严肃活泼的算法设计


试着读原题真是跪了,就是个摊煎饼问题却要扯一大堆有的没的


算法还是挺好想的,先把最大的翻到最上面,再连锅翻过来,最大的就到最底下了。之后就可以不用管这个煎饼了。

不过对于当前最大煎饼的位置要分类讨论:如果已经在最底下就什么也不做,如果已经在最顶上就直接连锅翻,如果在中间则需要按照上面的方法翻两次。



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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值