POJ PKU 3757 二分 模拟
(2010-04-08 15:41:24)
标签:
pojpku3757it |
分类: 杂题 |
题目描述:
你需要从k台电脑共同下载一个大小为F的东西(就是今天的BT),这k台中每台要下的大小为fi,
则易知, 需要满足k个fi的和恰为F,而且第i台电脑的下载所需时间
t = fi / pi fi / bi ,其中pi和bi是给定的参数,要求这k台的t都要相同,保证下载同步。
每天电脑的下载花费为fi * ci。
现在给你n台电脑,每台电脑有参数pi,bi,ci还有下载东西的总大小F,让你从中选k台下载,问你最小的花费是多少。
解题:
容易知道,每台电脑的下载速度vi * t = fi
每台电脑需要的时间(也是总时间,因为要同步) 为 t = F / sigema(vi);
总花费为 sigema(vi * fi) = sigema(t * vi * ci).
设xi = vi * ci
总花费即为: cost = F * (x0 x1 ... xk-1) / (v0 v1 ... vk-1),F为定值
把右边的分母乘到左边,即设 y = sigema(cost * vi - F * xi) = 0
二分枚举cost,对于每个cost,把0~n台电脑的cost * vi - F * xi排序,去最小的前k个,求和得y,
如果y > 0 cost 偏大,否则偏小,符合二分策略。
代码如下:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define epx 0.000001
using namespace std;
int n, k;
double f, l, r, mid;
struct e
{
}x[20004];
bool cmp(e a, e b)
{
}
double aabs(double
a){
int main()
{
}