Submission #72125078


Source Code Expand

Copy
#include <stdio.h>
int n, m;
int pos[16];
int encode_status(const int status[]) {
int res = 0;
int i;
for (i = 0; i < n; i++) {
res = res * 3 + status[i];
}
return res;
}
void decode_status(int status[], int status_id) {
int i;
for (i = n - 1; i >= 0; i--) {
status[i] = status_id % 3;
status_id /= 3;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

int n, m;
int pos[16];

int encode_status(const int status[]) {
	int res = 0;
	int i;
	for (i = 0; i < n; i++) {
		res = res * 3 + status[i];
	}
	return res;
}

void decode_status(int status[], int status_id) {
	int i;
	for (i = n - 1; i >= 0; i--) {
		status[i] = status_id % 3;
		status_id /= 3;
	}
}

const int from[4] = { 0, 1, 1, 2 }, to[4] = { 1, 0, 2, 1 };

#define INF 1010101010

/* 3**15 = 14348907 */
#define MAX 21234567
int q[MAX];
int mincost[MAX];

int main(void) {
	int i;
	int start_id;
	int qs = 0, qe = 0;
	if (scanf("%d%d", &n, &m) != 2) return 1;
	for (i = 0; i < 3; i++) {
		int num, j;
		if (scanf("%d", &num) != 1) return 1;
		for (j = 0; j < num; j++) {
			int koppu;
			if (scanf("%d", &koppu) != 1) return 1;
			pos[koppu - 1] = i;
		}
	}
	for (i = 0; i < MAX; i++) mincost[i] = INF;
	start_id = encode_status(pos);
	q[qe++] = start_id;
	mincost[start_id] = 0;
	while (qs < qe) {
		int cur = q[qs++];
		int cur_status[16];
		int cur_max[3] = { -1, -1, -1 };
		decode_status(cur_status, cur);
		for (i = 0; i < n; i++) {
			cur_max[cur_status[i]] = i;
		}
		if (cur_max[1] < 0 && (cur_max[0] < 0 || cur_max[2] < 0)) {
			printf("%d\n", mincost[cur] <= m ? mincost[cur] : -1);
			return 0;
		}
		for (i = 0; i < 4; i++) {
			if (cur_max[from[i]] > cur_max[to[i]]) {
				int next;
				cur_status[cur_max[from[i]]] = to[i];
				next = encode_status(cur_status);
				if (mincost[next] > mincost[cur] + 1) {
					mincost[next] = mincost[cur] + 1;
					q[qe++] = next;
				}
				cur_status[cur_max[from[i]]] = from[i];
			}
		}
	}
	puts("-1");
	return 0;
}

Submission Info

Submission Time
Task D - JOI 2006 予選 問題4
User mikecat
Language C23 (GCC 14.2.0)
Score 100
Code Size 1674 Byte
Status AC
Exec Time 151 ms
Memory 94380 KiB

Judge Result

Set Name all
Score / Max Score 100 / 100
Status
AC × 5
Set Name Test Cases
all data1, data2, data3, data4, data5
Case Name Status Exec Time Memory
data1 AC 33 ms 84668 KiB
data2 AC 32 ms 84524 KiB
data3 AC 31 ms 84524 KiB
data4 AC 31 ms 84644 KiB
data5 AC 151 ms 94380 KiB


2026-01-01 (Thu)
07:28:43 +09:00