intさわだんのBlack History

刹那的レジェンドになりたい。

第8回日本情報オリンピック 春合宿 JOI2009 3日目 問題2 「スキー」 (Ski)

二分探索の練習

平均最小化

小数の闇に注意

割と平均最大(小)化好きかもしれない。

#include <bits/stdc++.h>
using namespace std;
struct edge{
	int from;
	double time;
	int ren;
};
const int INF = 1000000000;

int n,m,c;
double dp[10009];
bool flag[10006];
vector<edge> g[10004];

bool ch(double x){
	for(int i = 1;i <= n;i++){
		if(flag[i] == true)dp[i] = 0;
		else dp[i] = -INF;
	}
	for(int i = 1;i <= n;i++){
		for(int j = 0;j < g[i].size();j++){
			edge es = g[i][j];
			dp[i] = max(dp[i],dp[es.from]+es.time*x-es.ren);
		}
	}
	if(dp[n] >= 0)return true;
	else return false;
}

int main(){
	scanf("%d%d%d",&n,&m,&c);
	for(int i = 0;i < m;i++){
		int y;
		scanf("%d",&y);
		flag[y] = true;
	}
	for(int i = 0;i < c;i++){
		int f,t,j,s;
		scanf("%d%d%d%d",&f,&t,&j,&s);
		double tt = (double) j / (double) s;
		edge tmp = {f,tt,j};
		g[t].push_back(tmp);
	}
	double lb = 0,ub = 100000;
	while(ub - lb > 0.0001){
		double mid = (lb + ub)/2;
		if(ch(mid))ub = mid;
		else lb = mid;
	}
	printf("%.f\n",ub);
	return 0;
}