洛谷-UVA120 煎餅 Stacks of Flapjacks

在這裏插入圖片描述
輸入格式
在這裏插入圖片描述
輸出格式
在這裏插入圖片描述
題意
給你一迭薄煎餅,請你寫一個程式來指出要如何安排才能使這些薄煎餅由上到下依薄煎餅的半徑由小到大排好。所有的薄煎餅半徑均不相同。

要把薄煎餅排好序需要對這些薄煎餅做翻面(flip)的動作。方法是以一抹刀插入一迭薄煎餅中,然後做翻面的動作(也就是說在抹刀上面的薄煎餅經翻面後,會依相反的次序排列)。若一迭共有n個薄煎餅,我們定義最底下的薄煎餅的位置爲1,最上面的薄煎餅位置爲n。當抹刀插入位置爲k時,代表從位置k到位置n的薄煎餅要做翻面的動作。

一開始時,這迭薄煎餅隨意堆放,並以半徑大小來表示。例如:以下3迭薄煎餅(最左邊那一迭8是最上面一個薄煎餅的半徑)

 8           7           2
 4           6           5
 6           4           8
 7           8           4
 5           5           6
 2           2           7

對最左邊那迭薄煎餅,如果我們把抹刀插在位置3(就是半徑爲7的那塊薄煎餅的下面)的地方做翻面,就會得到中間那迭,如果我們再把抹刀插在位置1(就是半徑爲2的那塊薄煎餅的下面)的地方做翻面,就會得到最右邊那迭。

Input

每組測試資料一列,內容爲這一迭薄煎餅一開始的狀態。每列開始的整數(介於1到100之間)代表位於最上方薄煎餅的半徑,依此類推。薄煎餅的數目介於1到30之間。請參考Sample Input。

Output

對每一組測試資料輸出2列。第一列爲原來那迭薄煎餅。第2列則爲要使這迭薄煎餅由小到大排列所做的翻面的動作。數字代表抹刀所插入的位置。(0代表已完成)。如果已經排好了,則不需再有翻面的動作。請參考Sample Output。

輸入輸出樣例
輸入 #1 複製
1 2 3 4 5
5 4 3 2 1
5 1 2 3 4
輸出 #1 複製
1 2 3 4 5
0
5 4 3 2 1
1 0
5 1 2 3 4
1 2 0


思路:選擇排序思想。

#include<cstdio>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;

const int maxn = 30 + 10;
int n, a[maxn];

// 翻轉a[0..p]
void flip(int p) {
  for(int i = 0; i < p-i; i++)
    swap(a[i], a[p-i]);
  printf("%d ", n-p);
}

int main() {
  string s;
  while(getline(cin, s)) {
    cout << s << "\n";
    stringstream ss(s);
    n = 0;
    while(ss >> a[n]) n++;
    for(int i = n-1; i > 0; i--) {
      int p = max_element(a, a+i+1) - a; // 元素a[0..i]中的最大元素
      if(p == i) continue;
      if(p > 0) flip(p);
      flip(i);
    }
    printf("0\n");
  }
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章