CodeForces 639E Bear and Paradox

CodeForces 639E Bear and Paradox

题目描述:

你现在在打一场比赛,一共有 N 道题,为了完成第 i 道题你需要连续花费 ti 分钟的时间。

T=iti ,那么在第 x 分钟结束时完成第 i 道题将会使你获得 pi(1cxT) ,其中 c[0,1] 是一个实数常量。在任何情况下,你都会采取最优的策略来做题,使得分数之和最大。对于一个 c ,可能存在多种不同的最优策略。

求最大的 c ,使得不存在这样一种最优策略:存在一对题目 (i,j) ,满足 pi<pj ,且第 i 题获得的分数严格大于第 j 题的。

题解:

观察式子发现,最优策略与 c 无关,且永远是按照 piti 递增的顺序做题。于是,对于每一道题,我们可以处理出它的最大和最小可能完成时间是多少。

之后二分答案 c ,如果有一道题,它的最小可能得分(这个可以直接利用我们预处理的东西算出来)严格小于之前 p 值比它小的题目的最大可能得分(也可以算出来),那么这个 c 值就是不可行的。

具体实现细节参见代码。

题目链接: vjudge 原网站

代码:


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAXN 150010

#define EPS (1e-8)

#define INF 1e10

static struct tProblem
{
    long long p, t, sum_t, max_t, min_t;
} val[MAXN];
static int N;
static long long T;

inline bool cmp1(const tProblem x, const tProblem y)
{
    return x.p * y.t > y.p * x.t;
}

inline bool cmp2(const tProblem x, const tProblem y)
{
    return x.p < y.p;
}

int main()
{
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) scanf("%lld", &val[i].p);
    for (int i = 1; i <= N; i++) scanf("%lld", &val[i].t), T += val[i].t;
    sort(val + 1, val + N + 1, cmp1);
    for (int i = 1; i <= N; i++) val[i].sum_t = val[i-1].sum_t + val[i].t;
    for (int i = 1, j; i <= N; i = j)
    {
        for (j = i; j <= N && val[i].p * val[j].t == val[j].p * val[i].t; j++);
        for (int k = i; k < j; k++)
            val[k].min_t = val[i-1].sum_t + val[k].t, val[k].max_t = val[j-1].sum_t;
    }
    sort(val + 1, val + N + 1, cmp2);
    double l = 0.0, r = 1.0;
    while (r - l > EPS)
    {
        double mid = (l + r) / 2, mx = -INF, used_mx = -INF;
        int flg = 1;
        for (int i = 1; flg && i <= N; i++)
        {
            if (val[i].p != val[i-1].p) used_mx = mx;
            if ((1.0 - mid * val[i].max_t / T) * val[i].p < used_mx)
                flg = 0;
            mx = max(mx, (1.0 - mid * val[i].min_t / T) * val[i].p);
        }
        if (flg) l = mid; else r = mid;
    }
    printf("%.10lf\n", l);
    return 0;
}

提交记录(AC / Total = 1 / 3):

Run IDRemote Run IDTime(ms)Memory(kb)ResultSubmit Time
850860225679823157712WA2017-03-21 12:06:11
850862025679864157716WA2017-03-21 12:11:04
8508799256801391717716AC2017-03-21 12:44:59
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值