結果
| 問題 | 
                            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;
}