Submission #73114403


Source Code Expand

Copy
#include <stdio.h>
int N;
int iro[11234];
int rle_num;
int rle_color[11234], rle_cnt[11234];
int kesu(int up, int down) {
int kieta = 0;
while (rle_color[up] == rle_color[down] && rle_cnt[up] + rle_cnt[down] >= 4) {
kieta += rle_cnt[up] + rle_cnt[down];
up--;
down++;
}
return kieta;
}
int main(void) {
int i;
int kesu_max = 0, candidate;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

int N;
int iro[11234];

int rle_num;
int rle_color[11234], rle_cnt[11234];

int kesu(int up, int down) {
	int kieta = 0;
	while (rle_color[up] == rle_color[down] && rle_cnt[up] + rle_cnt[down] >= 4) {
		kieta += rle_cnt[up] + rle_cnt[down];
		up--;
		down++;
	}
	return kieta;
}

int main(void) {
	int i;
	int kesu_max = 0, candidate;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 0; i < N; i++) {
		if (scanf("%d", &iro[i]) != 1) return 1;
	}

	rle_num = 2;
	rle_color[0] = -1;
	rle_cnt[0] = 0;
	rle_color[1] = iro[0];
	rle_cnt[1] = 1;
	for (i = 1; i < N; i++) {
		if (rle_color[rle_num - 1] == iro[i]) {
			rle_cnt[rle_num - 1]++;
		} else {
			rle_color[rle_num] = iro[i];
			rle_cnt[rle_num] = 1;
			rle_num++;
		}
	}
	rle_color[rle_num] = -1;
	rle_cnt[rle_num] = 0;
	rle_num++;

	for (i = 1; i < rle_num - 1; i++) {
		if (rle_cnt[i] > 1) {
			/* このブロックは2個以上 */
			rle_cnt[i]--;
			if (rle_cnt[i - 1] == 3) {
				/* 上のブロックにくっつける */
				candidate = 4 + kesu(i - 2, i);
				if (candidate > kesu_max) kesu_max = candidate;
			}
			if (rle_cnt[i + 1] == 3) {
				/* 下のブロックにくっつける */
				candidate = 4 + kesu(i, i + 2);
				if (candidate > kesu_max) kesu_max = candidate;
			}
			rle_cnt[i]++;
		} else {
			/* このブロックは1個 */
			if (rle_color[i - 1] == rle_color[i + 1]) {
				/* 上下のブロックは色が同じ */
				int naka = rle_cnt[i - 1] + rle_cnt[i] + rle_cnt[i + 1];
				if (naka >= 4) {
					candidate = naka + kesu(i - 2, i + 2);
					if (candidate > kesu_max) kesu_max = candidate;
				}
			} else {
				/* 上下のブロックは色が違う */
				if (rle_cnt[i - 1] == 3) {
					/* 上のブロックにくっつける */
					candidate = 4 + kesu(i - 2, i + 1);
					if (candidate > kesu_max) kesu_max = candidate;
				}
				if (rle_cnt[i + 1] == 3) {
					/* 下のブロックにくっつける */
					candidate = 4 + kesu(i - 1, i + 2);
					if (candidate > kesu_max) kesu_max = candidate;
				}
			}
		}
	}
	printf("%d\n", N - kesu_max);
	return 0;
}

/*

1回消すと4個以上消費するので、連鎖の回数は高々2500回
N=2500のO(N^2) ならいけるはず
今回は 10000×2500 だけど、制限時間10秒あるからいけるやろ

*/

Submission Info

Submission Time
Task C - 連鎖
User mikecat
Language C23 (GCC 14.2.0)
Score 100
Code Size 2375 Byte
Status AC
Exec Time 1 ms
Memory 1756 KiB

Judge Result

Set Name set01 set02 set04 set05
Score / Max Score 25 / 25 25 / 25 25 / 25 25 / 25
Status
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
set01 data1
set02 data2
set04 data4
set05 data5
Case Name Status Exec Time Memory
data1 AC 1 ms 1724 KiB
data2 AC 0 ms 1756 KiB
data4 AC 1 ms 1688 KiB
data5 AC 1 ms 1748 KiB


2026-02-08 (Sun)
02:20:43 +09:00