[CF489E] Hiking

前言

笔者01分数规划入门题

这是一篇水过去的博客!

题目

洛谷

CF

讲解

01分数规划问题,即有一个形如\(\frac{\sum a_i}{\sum b_i}\)的式子,求最大值或者最小值

本题是求最小值,即我们要求一个最小的\(x\)满足\(\frac{\sum a_i}{\sum b_i}\ge x\)

我们将式子变形,即为\(\sum a_i-x*\sum b_i\ge 0\)

对于解决这类问题的方法是二分\(x\)

完事了

代码

bool check(double x)
{
	for(int i = 1;i <= n;++ i) dp[i] = INF;
	dp[0] = 0;
	for(int i = 1;i <= n;++ i)
		for(int j = 0;j < i;++ j)
		{
			double t = dp[j] + sqrt(Abs(p[i] - p[j] - L)) - x * b[i];
			if(dp[i] > t) dp[i] = t,pre[i] = j;
		}
	return dp[n] >= 0;
}
void print(int x)
{
	if(!x) return;
	print(pre[x]);
	Put(x,' ');
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n = Read(); L = Read();
	for(int i = 1;i <= n;++ i) p[i] = Read(),b[i] = Read();
	double l = 0,r = 1e6;
	while(Abs(l-r) > eps)
	{
		double mid = (l+r) / 2;
		if(check(mid)) l = mid;
		else r = mid;
	}
	check(l);
	print(n);
	return 0;
}
posted @ 2020-10-04 16:30  皮皮刘  阅读(96)  评论(0编辑  收藏  举报