[LuoguP2989] [USACO10MAR]速度に対する速度の必要性のために必要

タイトル説明

平均値を最大化

ハーフ\(のx \)

\(\を確認してください)

\(\ FRAC {F + \ sum_ {i = 1} ^ {N} X_ {I} \回F_ {I}}、{M + \ sum_ {i = 1} ^ {N} X_ {I} \回M_ {I }} \ GEQ X \)

\(F +の\ sum_ {i = 1} ^ {N} X_ {I}回\ F_ {I} \ GEQ M \倍X + \ sum_ {i = 1} ^ {N} X_ {I}回\ M_ {I } \倍X \)

\(FM \時間X + \ sum_ {i = 1} ^ {N}(X_ {I} \回F_ {I} -X_ {I} \回M_ {I} \倍X)\ \ GE 0)

貪欲\(1 \)する(\ \ N-)より大きい(0 \)\ \ \((X_ {I}回X \回M_ {I} \回F_ {I} -X_ {I}) \)一緒に、何をすることができます決定

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

const int MAXN=10010;

int n,M,F,f[MAXN],m[MAXN];

inline bool check(double x){
    double sum=F-M*x;
    for(int i=1;i<=n;++i)
        sum+=max(0.0,f[i]-m[i]*x);
    return sum>=0;
}

int main()
{
    scanf("%d%d%d",&F,&M,&n);
    for(int i=1;i<=n;++i)
        scanf("%d%d",&f[i],&m[i]);
    double l=0,r=1e18;
    while(r-l>0.001){
        double mid=(l+r)/2.0;
        if(check(mid)) l=mid;
        else r=mid;
    }
    bool flag=0;
    for(int i=1;i<=n;++i)
        if(f[i]-m[i]*l>0) printf("%d\n",i),flag=1;
    if(!flag) puts("NONE");
    return 0;
}

おすすめ

転載: www.cnblogs.com/yjkhhh/p/11744150.html