답안 #703228

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
703228 2023-02-26T15:59:47 Z rainboy 팬케이크 정렬 (NOI12_pancake) C
20 / 25
1000 ms 616 KB
#include <stdio.h>

#define N	8
#define N_	40320	/* N_ = N! */

int ff[N + 1];

void init() {
	int i;

	ff[0] = 1;
	for (i = 1; i <= N; i++)
		ff[i] = ff[i - 1] * i;
}

int encode(int *pp, int n) {
	int i, p, k, b;

	b = 0, k = 0;
	for (i = 0; i < n; i++) {
		for (p = 0; p < pp[i]; p++)
			if ((b & 1 << p) == 0)
				k += ff[n - 1 - i];
		b |= 1 << pp[i];
	}
	return k;
}

void decode(int *pp, int n, int k) {
	int i, b;

	b = 0;
	for (i = 0; i < n; i++)
		for (pp[i] = 0; pp[i] < n; pp[i]++)
			if ((b & 1 << pp[i]) == 0) {
				if (k < ff[n - 1 - i]) {
					b |= 1 << pp[i];
					break;
				}
				k -= ff[n - 1 - i];
			}
}

int main() {
	int t;

	init();
	scanf("%d", &t);
	while (t--) {
		static int aa[N], pp[N], qq[N], qu[N_], dd[N_];
		int n, cnt, h, i, j, u, v, d, decr;

		scanf("%d", &n);
		for (i = 0; i < n; i++)
			scanf("%d", &aa[i]);
		for (u = 0; u < ff[n]; u++)
			dd[u] = ff[n];
		cnt = 0;
		dd[0] = 0, qu[cnt++] = 0;
		for (h = 0; h < cnt; h++) {
			u = qu[h], d = dd[u] + 1;
			decode(pp, n, u);
			decr = 1;
			for (i = 1; i < n; i++)
				if (aa[pp[i - 1]] < aa[pp[i]]) {
					decr = 0;
					break;
				}
			if (decr) {
				printf("%d\n", dd[u]);
				break;
			}
			for (i = 0; i < n; i++) {
				for (j = 0; j < n; j++)
					qq[j] = j < i ? pp[j] : pp[i + n - 1 - j];
				v = encode(qq, n);
				decode(qq, n, v);
				if (dd[v] > d)
					dd[v] = d, qu[cnt++] = v;
			}
		}
	}
	return 0;
}

Compilation message

pancake.c: In function 'main':
pancake.c:48:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |  scanf("%d", &t);
      |  ^~~~~~~~~~~~~~~
pancake.c:53:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |   scanf("%d", &n);
      |   ^~~~~~~~~~~~~~~
pancake.c:55:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |    scanf("%d", &aa[i]);
      |    ^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1057 ms 572 KB Time limit exceeded
2 Halted 0 ms 0 KB -