UVa Problem 120 Stacks of Flapjacks (煎饼堆)

// Stacks of Flapjacks (煎饼堆)// PC/UVa IDs: 110402/120, Popularity: B, Success rate: high Level: 2// Verdict: Accepted// Submission Date: 2011-05-22// UVa Run Time: 0.028s//// 版权所有(C)2011,邱秋。metaphysis # yeah dot net//// 先将数据排序,然后根据排序后的结果将原来的序列进行相应操作变成最终的序列。在排序时,由于可能有// 两个饼具有相同的直径,故需要记录数据的序号,恢复的方法是找到当前尚未排序的X,,先将其翻转到顶端,// 然后再翻转到其在最终排序后的位置。#include <iostream>#include <sstream>#include <algorithm>using namespace std;#define MAXSIZE 30struct pancake{int diameter;int index;};pancake pancakes[MAXSIZE];pancake original[MAXSIZE];bool cmp(pancake x, pancake y){return x.diameter < y.diameter;}void flip(int pos, int size){pancake tmp;int i = 0, j = size – pos;for (; i < j; i++, j–)if (original[i].diameter != original[j].diameter){tmp = original[i];original[i] = original[j];original[j] = tmp;}}int main(int ac, char *av[]){string line;while (getline(cin, line)){// 回显。cout << line << endl;// 读入数据。int capacity = 0;istringstream iss(line);while (iss >> pancakes[capacity].diameter){pancakes[capacity].index = capacity;original[capacity] = pancakes[capacity];capacity++;}// 排序。sort(pancakes, pancakes + capacity, cmp);// 执行翻转操作,若第 i 大元素未在第i位上,则先找到其序号,然后// 先将其翻转到顶端,然后再翻转到位置i。for (int i = capacity – 1; i >= 0; i–){// 在当前序列中找到该元素。// 假如数原来的序号与当前的序号不等,需要翻转操作。int marker;for (int j = 0; j < capacity; j++)if (original[j].index == pancakes[i].index){marker = j;break;}if (marker != i){if (marker != 0){cout << (capacity – marker) << " ";flip(capacity – marker, capacity);}cout << (capacity – i) << " ";flip(capacity – i, capacity);}}cout << "0" << endl;}return 0;}

没有行囊,没有目的,我孤独的走在路上,

UVa Problem 120 Stacks of Flapjacks (煎饼堆)

相关文章:

你感兴趣的文章:

标签云: