最近刷二分题单遇见了几个求最大比率的问题.在这里写一篇题解记录此类问题的解决方法.
此类问题基本要求解决在一组物品中(此类物品包含两种属性,ai和bi)选取一部分,令∑a/∑b的值最大或者最小.
若求最大,由题目可得:ans=∑a/∑b,进行移项可得∑a-ans*∑b.对这个ans进行二分,检测该答案是否存在,若存在就向右边找,反之向左边找,一直到二分到答案为止.下面是题目:
wyh的物品:
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,k;
double mid;
struct node
{
double x,y;
}arr[100005];
bool cmp(node a,node b)
{
return a.y-mid*a.x>b.y-mid*b.x;
}
int check()
{
double ans=0;
sort(arr,arr+n,cmp);
for(int i=0;i<k;i++)
{
ans+=(arr[i].y-mid*arr[i].x);
}
if(ans<0)return 0;
else return 1;
}
void binary()
{
double l=0.0,r=1e9;
while(r-l>1e-5)
{
mid=(l+r)/2;
if(check())
{
l=mid;
}
else
{
r=mid;
}
}
printf("%.2lf\n",l);
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&arr[i].x,&arr[i].y);
}
binary();
}
return 0;
}
小咪买东西
登录—专业IT笔试面试备考平台_牛客网https://ac.nowcoder.com/acm/problem/14662
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,k;
double mid;
struct node
{
int c,v;
}arr[10004];
bool cmp(node a,node b)
{
return a.v-mid*a.c>b.v-mid*b.c;
}
int check()
{
int ans=0;
sort(arr+1,arr+n+1,cmp);
for(int i=1;i<=k;i++)
{
ans+=arr[i].v-mid*arr[i].c;
}
if(ans<0)return 0;
else return 1;
}
void binary()
{
double l=0,r=1000000;
while(r-l>1e-4)
{
mid=(l+r)/2;
if(check())
{
l=mid;
}
else
r=mid;
}
printf("%d\n",(int)l);
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&arr[i].c,&arr[i].v);
}
binary();
}
return 0;
}