luoguP2989[USACO10MAR]对速度的需要Need For Speed
Posted yjkhhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luoguP2989[USACO10MAR]对速度的需要Need For Speed相关的知识,希望对你有一定的参考价值。
最大化平均值
二分一个(x)
(check):
(frac{F+sum_{i=1}^{n} X_{i} imes F_{i}}{M+sum_{i=1}^{n} X_{i} imes M_{i}}geq x)
(F+sum_{i=1}^{n} X_{i} imes F_{i} geq M imes x+sum_{i=1}^{n} X_{i} imes M_{i} imes x)
(F-M imes x+sum_{i=1}^{n} (X_{i} imes F_{i}-X_{i} imes M_{i} imes x)ge 0)
贪心的将(1)到(n)中大于(0)的((X_{i} imes F_{i}-X_{i} imes M_{i} imes x))加起来,判断一下就可以了
#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
",i),flag=1;
if(!flag) puts("NONE");
return 0;
}
以上是关于luoguP2989[USACO10MAR]对速度的需要Need For Speed的主要内容,如果未能解决你的问题,请参考以下文章
LuoguP2115 [USACO14MAR]破坏Sabotage二分答案By cellur925
[luoguP3052] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper(DP)
luogu1937 [USACO10MAR]仓配置Barn Allocation