結果
問題 | No.5020 Averaging |
ユーザー |
👑 |
提出日時 | 2024-02-25 16:53:08 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 991 ms / 1,000 ms |
コード長 | 5,142 bytes |
コンパイル時間 | 494 ms |
コンパイル使用メモリ | 36,864 KB |
実行使用メモリ | 6,676 KB |
スコア | 34,887,810 |
最終ジャッジ日時 | 2024-02-25 16:55:25 |
合計ジャッジ時間 | 52,811 ms |
ジャッジサーバーID (参考情報) |
judge14 / judge11 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
コンパイルメッセージ
main.c: In function 'random_optimal_triangle_playout': main.c:202:72: warning: passing argument 5 of 'optimal_triangle_playout' from incompatible pointer type [-Wincompatible-pointer-types] 202 | tmp = optimal_triangle_playout(N, A, B, K - r, tmp_move[r]); | ~~~~~~~~^~~ | | | int * main.c:105:80: note: expected 'int (*)[2]' but argument is of type 'int *' 105 | int optimal_triangle_playout(int N, long long AA[], long long BB[], int K, int move[][2]) | ~~~~^~~~~~~~~
ソースコード
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <sys/time.h>struct timeval tt;double beg, cur;#define MT_N 624#define MT_M 397#define MT_MATRIX_A 0x9908b0dfUL#define MT_UPPER_MASK 0x80000000UL#define MT_LOWER_MASK 0x7fffffffULstatic unsigned int mt[MT_N];static int mti = MT_N + 1;void init_genrand(unsigned int s){mt[0] = s & 0xffffffffUL;for (mti = 1; mti < MT_N; mti++) {mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);mt[mti] &= 0xffffffffUL;}}unsigned int genrand(){unsigned int y;static unsigned int mag01[2] = {0x0UL, MT_MATRIX_A};if (mti >= MT_N) {int kk;if (mti == MT_N + 1) init_genrand(5489UL);for (kk = 0; kk < MT_N - MT_M; kk++) {y = (mt[kk] & MT_UPPER_MASK) | (mt[kk+1] & MT_LOWER_MASK);mt[kk] = mt[kk+MT_M] ^ (y >> 1) ^ mag01[y&0x1UL];}for (; kk < MT_N - 1; kk++) {y = (mt[kk] & MT_UPPER_MASK) | (mt[kk+1] & MT_LOWER_MASK);mt[kk] = mt[kk+(MT_M-MT_N)] ^ (y >> 1) ^ mag01[y&0x1UL];}y = (mt[MT_N-1] & MT_UPPER_MASK) | (mt[0] & MT_LOWER_MASK);mt[MT_N-1] = mt[MT_M-1] ^ (y >> 1) ^ mag01[y&0x1UL];mti = 0;}y = mt[mti++];y ^= (y >> 11);y ^= (y << 7) & 0x9d2c5680UL;y ^= (y << 15) & 0xefc60000UL;y ^= (y >> 18);return y;}void shuffle_permutation(int N, int p[], int K){int i, j;while (K--) {i = genrand() % N + 1;j = genrand() % N + 1;if (i != j) {p[i] ^= p[j];p[j] ^= p[i];p[i] ^= p[j];}}}void chmax(long long *a, long long b){if (*a < b) *a = b;}const long long THR = 500000000000000000LL;int score(int N, long long AA[], long long BB[], int K, int move[][2]){static int i, j, k;static long long A[46], B[46], tmp;for (i = 1; i <= N; i++) {A[i] = AA[i];B[i] = BB[i];}for (k = 1; k <= K; k++) {i = move[k][0];j = move[k][1];tmp = (A[i] + A[j]) / 2;A[i] = tmp;A[j] = tmp;tmp = (B[i] + B[j]) / 2;B[i] = tmp;B[j] = tmp;}printf("%lld %lld\n", A[1], B[1]);tmp = llabs(A[1] - THR);chmax(&tmp, llabs(B[1] - THR));return (int)(2000000 - 100000 * log10(tmp + 1.0));}int optimal_triangle_playout(int N, long long AA[], long long BB[], int K, int move[][2]){static int i, j, k, ii, jj, argmin[2];static long long A[4], B[4], tmp, min;min = THR * 3 + 10;for (ii = 2; ii <= N; ii++) {for (jj = ii + 1; jj <= N; jj++) {tmp = llabs(AA[1] + AA[ii] + AA[jj] - THR * 3 - 10);chmax(&tmp, llabs(BB[1] + BB[ii] + BB[jj] - THR * 3 - 10));if (min > tmp) {min = tmp;argmin[0] = ii;argmin[1] = jj;}}}ii = argmin[0];jj = argmin[1];A[1] = AA[1];B[1] = BB[1];A[2] = AA[ii];B[2] = BB[ii];A[3] = AA[jj];B[3] = BB[jj];for (k = 1, i = 1, j = 2; k <= K; k++, j ^= 1) {tmp = (A[i] + A[j]) / 2;A[i] = tmp;A[j] = tmp;tmp = (B[i] + B[j]) / 2;B[i] = tmp;B[j] = tmp;move[k][0] = 1;move[k][1] = (j == 2)? ii: jj;}tmp = llabs(A[1] - THR);chmax(&tmp, llabs(B[1] - THR));min = tmp;if (K > 1) {A[1] = AA[1];B[1] = BB[1];A[2] = (AA[ii] + AA[jj]) / 2;B[2] = (BB[ii] + BB[jj]) / 2;A[3] = A[2];B[3] = B[2];for (k = 2, i = 1, j = 2; k <= K; k++, j ^= 1) {tmp = (A[i] + A[j]) / 2;A[i] = tmp;A[j] = tmp;tmp = (B[i] + B[j]) / 2;B[i] = tmp;B[j] = tmp;}tmp = llabs(A[1] - THR);chmax(&tmp, llabs(B[1] - THR));if (min > tmp) {move[1][0] = ii;move[1][1] = jj;for (k = 2, j = 2; k <= K; k++, j ^= 1) {move[k][0] = 1;move[k][1] = (j == 2)? ii: jj;}}}return (int)(2000000 - 100000 * log10(min + 1.0));}int random_optimal_triangle_playout(int N, long long AA[], long long BB[], int K, int move[][2]){static int i, j, k, r, ans, tmp_move[51][2];static long long A[46], B[46], tmp;ans = optimal_triangle_playout(N, AA, BB, K, move);while (1) {gettimeofday(&tt, NULL);cur = tt.tv_sec + (double)tt.tv_usec / 1000000;if (cur - beg > 0.99) break;for (i = 1; i <= N; i++) {A[i] = AA[i];B[i] = BB[i];}r = genrand() % 11 + 30;for (k = 1; k <= r; k++) {do {i = genrand() % N + 1;j = genrand() % N + 1;} while (i == j);tmp = (A[i] + A[j]) / 2;A[i] = tmp;A[j] = tmp;tmp = (B[i] + B[j]) / 2;B[i] = tmp;B[j] = tmp;tmp_move[k][0] = i;tmp_move[k][1] = j;}tmp = optimal_triangle_playout(N, A, B, K - r, tmp_move[r]);if (ans < tmp) {ans = tmp;for (k = 1; k <= K; k++) {move[k][0] = tmp_move[k][0];move[k][1] = tmp_move[k][1];}}}return ans;}int main(){gettimeofday(&tt, NULL);beg = tt.tv_sec + (double)tt.tv_usec / 1000000;int i, N;long long A[46], B[46];scanf("%d", &N);for (i = 1; i <= N; i++) scanf("%lld %lld", &(A[i]), &(B[i]));int k = 50, ans, move[51][2];ans = random_optimal_triangle_playout(N, A, B, k, move);// printf("%d\n", score(N, A, B, k, move));printf("%d\n", k);for (i = 1; i <= k; i++) printf("%d %d\n", move[i][0], move[i][1]);fflush(stdout);return 0;}