首页 > 代码库 > Laptop Chargers
Laptop Chargers
题目链接
- 题意:
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:\n", kase++); scanf("%lf", &inp); REP(i, n) { scanf("%lf%lf%lf", &c[i], &t[i], &r[i]); otp += c[i] / t[i]; } printf("%.0f\n", 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\n", l); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。