Submission #1555584


Source Code Expand

#pragma region include
#include <iostream>
#include <iomanip>
#include <stdio.h>

#include <sstream>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <complex>

#include <string>
#include <cstring>
#include <vector>
#include <tuple>
#include <bitset>

#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>

#include <fstream>
#include <random>
//#include <time.h>
#include <ctime>
#pragma endregion //#include
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
#define ALL(X) X.begin(), X.end()
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef std::pair<LL,LL> PLL;//
typedef std::pair<int,int> PII;//
#pragma endregion //typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9+7;
const LL LINF = (LL)1e18+20;
const LD PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace::std;

/*
thx
http://cf16-exhibition-final-open.contest.atcoder.jp/submissions/1005311
*/

struct City{//位置x,位置y,水量
	int x,y,a;
};
void solve(){
	int N;
	cin >> N;
	vector<City> cities(N);
	for(int i=0;i<N;++i){
		int x,y,a;
		cin >> x >> y >> a;
		//cities[i] = {x,y,a};
		cities[i].x = x;
		cities[i].y = y;
		cities[i].a = a;
	}
	//dist[i][j]:=i,j間の距離
	vector< vector<double> > dist(N,vector<double>(N));
	for(int i=0;i<N;++i){
		for(int j=0;j<N;++j){
			//ユークリッド距離
			//dist[i][j] = hypot(cities[i].x-cities[j].x, cities[i].y-cities[j].y);
			//Cityの中がint
			// 10^5*10^5 などでOVF
			/*dist[i][j] = (cities[i].x-cities[j].x)*(cities[i].x-cities[j].x)
				+(cities[i].y-cities[j].y)*(cities[i].y-cities[j].y);
			dist[i][j] = sqrt( dist[i][j] );
			*/
			double X = (cities[i].x-cities[j].x);
			double Y = (cities[i].y-cities[j].y);
			dist[i][j] = sqrt(X*X+Y*Y);
		}
	}
	
	//初期化
	vector<double> mstCost(1<<N,1e99);
	for(int i=0;i<N;++i){
		mstCost[1<<i] = 0;
	}

	/*
	集合Sを連結にするための最小コスト:最小全域木
	(MST:Minimum Spanning Tree)
	*/
	for(int S=1;S<(1<<N)-1;++S){
		double x = mstCost[S];
		for(int i=0;i<N;++i){
			if( (S >> i) & 1 ){//
				for(int j=0;j<N;++j){
					if( ~S >> j & 1){//
						mstCost[S|(1<<j)] = min(mstCost[S|(1<<j)],
							x + dist[i][j]);
					}
				}
			}
		}
	}

	/////
	/*
	ある部分集合Sで、水量の平均を最大化すると
	value[S]になる。かな?
	*/
	vector<double> value(1<<N,0);
	for(int S=1;S<(1<<N);++S){
		double sumA = 0;//Sに含まれる都市の水量
		int K = 0;//Sに含まれる都市の数
		for(int i=0;i<N;++i){
			if( (S>>i) & 1 ){
				sumA += cities[i].a;
				++K;
			}
		}
		value[S] = max(0.0, sumA - mstCost[S]) / K;
	}

	/////
	vector<double> dp(1<<N);
	dp[0] = 1e99;
	/*
	あるSのときSの部分集合は計算済み
	*/
	for(int S=1;S<(1<<N);++S){
		double x = 0;//dp[S]での最大値を入れる

		//Sを分割して、それぞれ最小値の最大値を見る
		for(int T = S; T> 0 ; (--T) &= S ){
			//T=0の場合,value[0]=0 => min(value[0],dp[S]) => 0
			//max(x,0) => x
			x = max(x, min(value[T],dp[S-T]) );
		}
		dp[S] = x;
	}
	double ans = dp.back();//dp[(1<<N)-1];//dp.back();
	cout << ans << endl;
}

#pragma region main
signed main(void){
	std::cin.tie(0);
	std::ios::sync_with_stdio(false);
	std::cout << std::fixed;//小数を10進数表示
	cout << setprecision(16);//小数点以下の桁数を指定//coutとcerrで別	

	solve();
}
#pragma endregion //main()

Submission Info

Submission Time
Task E - Water Distribution
User akarin55
Language C++14 (GCC 5.4.1)
Score 1000
Code Size 3670 Byte
Status AC
Exec Time 37 ms
Memory 1024 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 2
AC × 46
Set Name Test Cases
Sample example0.txt, example1.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, example0.txt, example1.txt
Case Name Status Exec Time Memory
000.txt AC 36 ms 1024 KB
001.txt AC 36 ms 1024 KB
002.txt AC 36 ms 1024 KB
003.txt AC 36 ms 1024 KB
004.txt AC 36 ms 1024 KB
005.txt AC 36 ms 1024 KB
006.txt AC 36 ms 1024 KB
007.txt AC 36 ms 1024 KB
008.txt AC 36 ms 1024 KB
009.txt AC 36 ms 1024 KB
010.txt AC 36 ms 1024 KB
011.txt AC 36 ms 1024 KB
012.txt AC 36 ms 1024 KB
013.txt AC 36 ms 1024 KB
014.txt AC 36 ms 1024 KB
015.txt AC 36 ms 1024 KB
016.txt AC 37 ms 1024 KB
017.txt AC 36 ms 1024 KB
018.txt AC 36 ms 1024 KB
019.txt AC 36 ms 1024 KB
020.txt AC 36 ms 1024 KB
021.txt AC 36 ms 1024 KB
022.txt AC 36 ms 1024 KB
023.txt AC 36 ms 1024 KB
024.txt AC 36 ms 1024 KB
025.txt AC 36 ms 1024 KB
026.txt AC 36 ms 1024 KB
027.txt AC 36 ms 1024 KB
028.txt AC 36 ms 1024 KB
029.txt AC 37 ms 1024 KB
030.txt AC 36 ms 1024 KB
031.txt AC 37 ms 1024 KB
032.txt AC 36 ms 1024 KB
033.txt AC 36 ms 1024 KB
034.txt AC 36 ms 1024 KB
035.txt AC 36 ms 1024 KB
036.txt AC 36 ms 1024 KB
037.txt AC 36 ms 1024 KB
038.txt AC 36 ms 1024 KB
039.txt AC 36 ms 1024 KB
040.txt AC 1 ms 256 KB
041.txt AC 1 ms 256 KB
042.txt AC 1 ms 256 KB
043.txt AC 1 ms 256 KB
example0.txt AC 1 ms 256 KB
example1.txt AC 36 ms 1024 KB