結果
| 問題 |
No.9 モンスターのレベル上げ
|
| ユーザー |
bal4u
|
| 提出日時 | 2019-08-18 10:04:59 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 237 ms / 5,000 ms |
| コード長 | 1,898 bytes |
| コンパイル時間 | 364 ms |
| コンパイル使用メモリ | 31,232 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-20 19:40:30 |
| 合計ジャッジ時間 | 3,182 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
コンパイルメッセージ
main.c: In function 'in':
main.c:9:14: warning: implicit declaration of function 'getchar_unlocked' [-Wimplicit-function-declaration]
9 | #define gc() getchar_unlocked()
| ^~~~~~~~~~~~~~~~
main.c:15:24: note: in expansion of macro 'gc'
15 | int n = 0, c = gc();
| ^~
ソースコード
// yukicoder: No.9 モンスターのレベル上げ
// bal4u 2019.8.18
#include <stdio.h>
#include <string.h>
//// 入出力関係
#if 1
#define gc() getchar_unlocked()
#else
#define gc() getchar()
#endif
int in() { // 非負整数の入力
int n = 0, c = gc();
do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');
return n;
}
//// 優先度付き(最小)キュー
#define MAX 10000
typedef struct { int a, n; } QUE;
QUE que[MAX]; int qsize;
QUE qcp[MAX]; int qsz;
#define PARENT(i) ((i)>>1)
#define LEFT(i) ((i)<<1)
#define RIGHT(i) (((i)<<1)+1)
void min_heapify(int i) {
int l, r, mi;
l = LEFT(i), r = RIGHT(i);
if (l < qsize && (que[l].a < que[i].a ||
que[l].a == que[i].a && que[l].n < que[i].n)) mi = l; else mi = i;
if (r < qsize && (que[r].a < que[mi].a ||
que[r].a == que[mi].a && que[r].n < que[mi].n)) mi = r;
if (mi != i) {
QUE qt = que[i]; que[i] = que[mi]; que[mi] = qt;
min_heapify(mi);
}
}
void deq() {
que[0] = que[--qsize];
min_heapify(0);
}
void enq(int a, int n) {
int i, mi;
i = qsize++;
que[i].a = a, que[i].n = n;
while (i > 0 && (que[i].a < que[mi = PARENT(i)].a ||
que[i].a == que[mi].a && que[i].n < que[i].n)) {
QUE qt = que[i]; que[i] = que[mi]; que[mi] = qt;
i = mi;
}
}
//// 本問題関連
int N;
int a[1503], b[1503];
int main()
{
int i, j, k, t, ans;
N = in();
for (i = 0; i < N; i++) a[i] = in();
for (i = 0; i < N; i++) b[i] = in();
if (N == 1) { puts("1"); return 0; }
ans = N;
qsize = 0;
for (i = 0; i < N; i++) enq(a[i], 0);
memcpy(qcp, que, sizeof(que)), qsz = qsize;
for (i = 0; i < N; i++) {
if (i) qsize = qsz, memcpy(que, qcp, sizeof(que));
t = 0, k = i; for (j = 0; j < N; j++) {
int x = que[0].a, y = que[0].n+1; deq();
enq(x + (b[k]>>1), y);
if (y > t) t = y;
if (++k == N) k = 0;
}
if (t < ans) { ans = t; if (ans == 1) break; }
}
printf("%d\n", ans);
return 0;
}
bal4u