[CF489E] Hiking
前言
笔者01分数规划入门题
这是一篇水过去的博客!
题目
讲解
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;
}