水水题。给出煎饼数列, 一次只能让第一个到第i个数列全部反转,要求把数列排序为升序。
算法点破后不值几钱。。。
只要想办法把最大的煎饼放到最后一个,然后就变成前面那些煎饼的数列的子题目了。递归或循环即可。
把大饼放后面只要先让前面翻转使大饼排在后面,再整体翻转让大饼排到后面。
这题不是求最优解,我也不知道这样是不是最优解。
AC代码:
#include <cstdio> #include <cstring> int const maxn = 31; int arr[maxn], n; void rev(int cut) { printf("%d ", n - cut); for (int i = 0; i <= cut / 2; i++) { int tmp = arr[i]; arr[i] = arr[cut - i]; arr[cut - i] = tmp; }//for }//rev int scan(void) { char ch = 0; memset(arr, 0, sizeof(arr)); if (scanf("%d", &arr[0]) == EOF) return 0; int i = 1; while ((ch = getchar()) && ch != ' ') { scanf("%d", &arr[i++]); }//while return i; }//get a array int main() { freopen("in", "r", stdin); while (n = scan()) { printf("%d", arr[0]); for (int i = 1; i < n; i++) printf(" %d", arr[i]); printf(" "); int cnt = n; while (cnt) { int max = 0, rec; for (int i = 0; i < cnt; i++) { if (arr[i] > max) { max = arr[i]; rec = i; }//if }//for choose the max if (rec != cnt - 1) { if (rec != 0) rev(rec); rev(cnt - 1); } cnt --; }//while recycle printf("0 "); }//while return 0; }
复杂度应该是n^3,用时0.019s,看到人家0.000s的实在佩服。。。