Uva120 Stacks of Flapjacks 翻煎饼

水水题。给出煎饼数列, 一次只能让第一个到第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 != '\n') {
		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("\n");
		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\n");
	}//while
	return 0;
}


复杂度应该是n^3,用时0.019s,看到人家0.000s的实在佩服。。。

你可能感兴趣的:(stack)