結果
| 問題 |
No.2010 Magical Floor
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-07-15 22:25:13 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 2,000 ms |
| コード長 | 927 bytes |
| コンパイル時間 | 1,490 ms |
| コンパイル使用メモリ | 31,488 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-27 18:57:20 |
| 合計ジャッジ時間 | 2,331 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 21 |
ソースコード
#include <stdio.h>
#include <math.h>
const long double eps = 1e-9;
void chmin(long double *a, long double b)
{
if (*a > b) *a = b;
}
long double solve()
{
int i, N, H[101], A[101];
long double X;
scanf("%d %Lf", &N, &X);
for (i = 1, H[0] = 0; i <= N; i++) scanf("%d", &(H[i]));
for (i = 1; i <= N; i++) scanf("%d", &(A[i]));
int j, k;
long double ans = X * A[1], tmp, Y, Z;
for (k = 2; k <= N; k++) {
for (j = 1; j < k; j++) if (A[j] <= A[k]) break;
if (j < k) continue;
for (j = 1, Y = X, tmp = 0; j < k; j++) {
Z = sqrtl((long double)A[k] * A[k] / ((long double)A[j] * A[j] - (long double)A[k] * A[k]));
Y -= Z * (H[j] - H[j-1]) * 2.0;
if (Y < -eps) break;
tmp += sqrtl(1.0 + Z * Z) * (H[j] - H[j-1]) * 2.0 * A[j];
}
if (j == k) chmin(&ans, tmp + Y * A[k]);
}
return ans;
}
int main()
{
int T;
scanf("%d", &T);
while (T--) printf("%.9Lf\n", solve());
fflush(stdout);
return 0;
}