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;
#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 |
|
|
|
|
| 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 |