题目链接: 点我
题目大意: 给出物品的w和v,选出k个物品使得
s值最大。
题目分析: 不能直接按照v/w贪心来做,举个反例:
w v
2 2
5 3
2 1
选1和3,结果是0.75,但选1和2,结果是5/7 = 0.7140
下面搬运一下《挑战程序设计》
Problem: 3111 User: ChenyangDu
Memory: 1860K Time: 4360MS
Language: G++ Result: Accepted
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100000+5,INF = 0x7fffffff;
int n,m;
double mid;
struct jew {int v,w,id;}in[maxn];
bool cmp (jew a,jew b){
double aa = (double)a.v - mid*(double)a.w;
double bb = (double)b.v - mid*(double)b.w;
return aa>bb;
}
int C(double x){
double sum = 0;
for(int i=0;i<m;i++){
jew a = in[i];
sum += (double)a.v - x*(double)a.w;
if(sum<0)return i;
}
return m;
}
int main(){
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d%d",&in[i].v,&in[i].w);
in[i].id = i+1;
}
double l = 0,r = INF;
int T = 52;
while(T--){
mid = (l+r)/2;
sort(in,in+n,cmp);
if(C(mid) >= m)l = mid;
else r = mid;
}
for(int i=0;i<m;i++)
printf("%d ",in[i].id);
fclose(stdin);
return 0;
}