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; }