题目描述:
有n个物品的重量和价值分别是 wi 和 vi。从中选出k个物品使得单位重量的价值最大。
输入格式:
第一行输入两个整数 n,k
第二行输入n个整数wi
第三行输入n个整数vi
输出格式:
输出一个浮点数,保留两位小数
样例输入:
3 2
2 5 2
2 3 1
样例输出:
0.75
#include<bits/stdc++.h>
using namespace std;
#define maxn 10010
double w[maxn],v[maxn],c[maxn];
int n,k;
bool ok(double ans)
{
for(int i=0;i<n;i++)
c[i]=v[i]-ans*w[i];
sort(c,c+n);
double cnt=0;
for(int i=0;i<k;i++)
cnt+=c[n-1-i];
return cnt>=0;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%lf",&w[i]);
for(int i=0;i<n;i++)
scanf("%lf",&v[i]);
double l=0,r=1000010;
while(abs(l-r)>1e-6)
{
double mid=(l+r)/2;
if(ok(mid))
l=mid;
else
r=mid;
}
printf("%.2lf\n",r);
return 0;
}
#include
#include
#include
#include
#include
#define INF 0x3f3f3f
using namespace std;
int n,k;
int v[500000],w[500000];
double y[500000];
bool check(double x)
{
for(int i=0;i<n;i++)
{
y[i]=v[i]-x*w[i];
}
sort(y,y+n);
double sum=0;
for(int i=0;i<k;i++)
{
sum+=y[n-i-1];
}
if(sum>=0)return true;
else return false;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>w[i];
}
for(int i=0;i<n;i++)
{
cin>>v[i];
}
double l=0,r=INF;
for(int i=0;i<100;i++)
{
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
printf("%.2f\n",r);
}