#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_SCT_MAX		100										// 最大区間数

// 内部構造体 - 区間情報
typedef struct Sct {
	int miSec;													// 秒
	int miSpd;													// 最大速度
} Sct;

// 内部変数
static Sct sz1Sct[D_SCT_MAX + 5];								// 区間情報
static int siSCnt;												// 区間情報数
static int siSpd;												// 現在速度
static double sdLen;											// 距離合計

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// 距離加算
int
fAddLen(
	double pdSpd				// <I> 初速度
	, int piAdd					// <I> 加速度
	, double pdSec				// <I> 秒
)
{
	// 加算
	sdLen += pdSpd * pdSec + 0.5 * (double)piAdd * pdSec * pdSec;

	return 0;
}

// 区間毎に距離加算
int
fAddOne(
	int piSNo					// <I> 対象区間 0～
)
{
	int i;

	// 現在区間の終了時の速度
	int liSpdEnd = sz1Sct[piSNo].miSpd;						// 初期値

	// 現在区間の終了時の速度 - 更新(以降の区間チェック)
	int liSecPast = 0;										// 経過秒
	for (i = piSNo + 1; i <= siSCnt; i++) {
		int liVal = sz1Sct[i].miSpd + liSecPast;				// 減速可能な最大速度
		if (liSpdEnd > liVal) {
			liSpdEnd = liVal;
		}
		liSecPast += sz1Sct[i].miSec;							// 秒加算
	}

	// 残り時間
	int liSecLast = sz1Sct[piSNo].miSec;

	// 現在速度を終了時の速度に合わせる部分
	int liSecUse = 0;										// 現在速度を終了時の速度に合わせる時間
	int liSpdUD = siSpd;									// 加速＋減速部分用の初速度
	if (siSpd > liSpdEnd) {									// 最後に減速
		liSecUse = siSpd - liSpdEnd;							// 現在速度を終了時の速度に合わせる時間
		fAddLen((double)siSpd, -1, (double)liSecUse);			// 距離加算
	}
	else if (siSpd < liSpdEnd) {							// 最初に加速
		liSecUse = liSpdEnd - siSpd;							// 現在速度を終了時の速度に合わせる時間
		if (liSecUse > liSecLast) {								// 時間不足
			liSecUse = liSecLast;									// 全加速
			liSpdEnd = siSpd + liSecUse;							// 全加速後の速度
		}
		else {													// 時間内
			liSpdUD = siSpd + liSecUse;								// 加速＋減速部分用の初速度
		}
		fAddLen((double)siSpd, 1, (double)liSecUse);			// 距離加算
	}

	// 現在速度 - 更新
	siSpd = liSpdEnd;

	// 残り時間
	liSecLast -= liSecUse;
	if (liSecLast < 1) {									// なし
		return 0;
	}

	// 加速＋減速部分
	int liSecUD = (sz1Sct[piSNo].miSpd - liSpdUD) * 2;		// 加速＋減速時間
	if (liSecUD > 0) {										// あり

		// 残り時間をチェック
		if (liSecUD > liSecLast) {
			liSecUD = liSecLast;
		}

		// 加速部分
		double ldSec = (double)liSecUD / 2;					// 時間
		fAddLen((double)liSpdUD, 1, ldSec);					// 距離加算

		// 減速部分
		double ldSpd = (double)liSpdUD + ldSec;				// 速度
		fAddLen(ldSpd, -1, ldSec);							// 距離加算
	}

	// 残り時間
	liSecLast -= liSecUD;
	if (liSecLast < 1) {									// なし
		return 0;
	}

	// 最大速度部分
	fAddLen(sz1Sct[piSNo].miSpd, 0, (double)liSecLast);		// 距離加算

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024], lc1Out[1024];

	// データ初期化
	siSpd = 0;													// 現在速度
	sdLen = 0.0;												// 距離合計

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 区間情報数取得
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d", &siSCnt);

	// 秒取得
	for (i = 0; i < siSCnt; i++) {
#ifdef D_TEST
		fscanf(szpFpT, "%d", &sz1Sct[i].miSec);
#else
		fscanf(stdin, "%d", &sz1Sct[i].miSec);
#endif
	}
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif

	// 最大速度取得
	for (i = 0; i < siSCnt; i++) {
#ifdef D_TEST
		fscanf(szpFpT, "%d", &sz1Sct[i].miSpd);
#else
		fscanf(stdin, "%d", &sz1Sct[i].miSpd);
#endif
	}
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif

	// 目的地追加
	sz1Sct[siSCnt].miSec = 0;
	sz1Sct[siSCnt].miSpd = 0;

	// 区間毎に距離加算
	for (i = 0; i < siSCnt; i++) {
		fAddOne(i);
	}

	// 結果セット
	sprintf(lc1Out, "%.15lf\n", sdLen);

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 256