Laptop Chargers
2019-07-14 02:35发布
生成海报
题目链接
- 题意:
n个电脑,若干个电源,q个询问
一个整数x,表示充电器每秒能充进的电量(所有充电器一样)
n行,每行三个数,c、t、r,分别表示电脑电池容量、满电用完需要的时间、当前电池剩余电量
q行,每行一个数k,表示当前给k个电源
先输出至少需要几个充电器,可以让所有电脑都一直有电
对于每个询问,输出用这么多电源,所有电脑同时有电的最长时间是多少(若大于100000,输出-1.000) - 分析:
题目意思是任意时刻都可能充电。。。所以就不用考虑电源的分配问题,只用考虑耗电速度和充电速度即可
第一种问题,也就是耗电速度大于等于充电速度,解一个方程即可
第二种问题,显然二分最优,直接二分答案计算即可
const double EPS = 1e-4;
const int MAXN = 200;
double c[MAXN], t[MAXN], r[MAXN];
int n, q, kase = 1;
double otp, inp;
bool check(double time, double all)
{
double cost = 0;
REP(i, n)
cost += max(0.0, time * (c[i] / t[i]) - r[i]);
return cost <= all;
}
int main()
{
// freopen("in.txt", "r", stdin);
while (~RII(n, q) && n)
{
otp = 0;
printf("Case %d:
", kase++);
scanf("%lf", &inp);
REP(i, n)
{
scanf("%lf%lf%lf", &c[i], &t[i], &r[i]);
otp += c[i] / t[i];
}
printf("%.0f
", ceil(otp / inp));
REP(i, q)
{
int t;
RI(t);
double l = 0, r = 100001;
while (l + EPS <= r)
{
double m = (l + r) / 2;
if (check(m, t * inp * m))
l = m;
else
r = m;
}
if (l > 100000)
puts("-1.000");
else
printf("%.3f
", l);
}
}
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮