unittest
{
	assert( [ "1", "100", "30" ].parse.expand.solve == "2100.000" );
	assert( [ "2", "60 50", "34 38" ].parse.expand.solve == "2632.000" );
	assert( [ "3", "12 14 2", "6 2 7" ].parse.expand.solve == "76.000" );
	assert( [ "1", "9", "10" ].parse.expand.solve == "20.250" );
	assert( [ "10", "64 55 27 35 76 119 7 18 49 100", "29 19 31 39 27 48 41 87 55 70" ].parse.expand.solve == "20291.000" );
}



import std.algorithm;
import std.conv;
import std.format;
import std.math;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	input.popFront;
	auto ts = input.front.split.to!( long[] );
	input.popFront;
	auto vs = input.front.split.to!( long[] );
	return tuple( ts, vs );
}

auto solve( long[] ts, long[] vs )
{
	// 速度上限配列から時間基準の速度配列を作成
	auto ss = new double[ 100 * 200 * 2 + 2 ];
	auto tt = 1L;
	ss[ 0 ] = 0;
	foreach( t, v; lockstep( ts, vs ) )
	{
		auto t2 = t * 2;		// 奇数秒を2で割る場合があるので、時間を0.5秒区切りにして整数で扱えるようにする
		ss[ tt - 1 ] = min( ss[ tt - 1 ], v );
		ss[ tt .. tt + t2 ] = v;
		tt += t2;
	}
	ss.length = tt;
	ss[ $ - 1 ] = 0;
	
	// 加速を計算
	for( auto i = 0L; i < ss.length.signed - 1; i++ )
	{
		if( ss[ i ] < ss[ i + 1 ] ) ss[ i + 1 ] = ss[ i ] + 0.5;		// 時間が0.5秒区切りなので1m/s^2の半分を加算
	}
	
	// 減速を計算
	for( auto i = ss.length.signed - 1; 0 < i; i-- )
	{
		if( ss[ i ] < ss[ i - 1 ] ) ss[ i - 1 ] = ss[ i ] + 0.5;		// 時間が0.5秒区切りなので1m/s^2の半分を加算
	}
	
	// 合計距離を計算
	auto ans = ss.sum / 2;		// 時間を0.5秒区切りから1秒区切りに戻す
	return format( "%0.3f", ans );
}
