题目: NC14662 小咪买东西 ,哈哈,我们今天来看一道01分数规划的题嘛,这是选自牛客上的一道题,好了,我们一起来看看题意吧:
考虑到直接复制题目,或者截屏的方式不是很方便阅读,我就把直接题目链接放下面!
题目传送门: NC14662 小咪买东西
思路
:
采用二分答案的思想,假设答案为x,那么商品的贡献为
v-x*c
,然后我们取前k个贡献最大的商品求和得到sum,若sum<0,则x假设大了,sum>0,则x小了,具体的直接看代码!!!
我们来看看成功AC的代码吧:
#include<bits/stdc++.h> using namespace std; #define ll long long int t,n,k; int l,r; struct ed{ int c,v; }a[10010]; ll y; int cmp(ed a,ed b){ return (a.v-y*a.c)>(b.v-y*b.c);}//按照这个规则排序 ll check(ll x){ y=x; sort(a+1,a+n+1,cmp); ll sum=0,c=0,v=0; for(int i=1;i<=k;i++){ sum+=a[i].v-x*a[i].c; c+=a[i].c; v+=a[i].v; } if(sum>0) return -1; return v/c; } int main(){ cin>>t; while(t--){ cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i].c>>a[i].v; l=0,r=1e8+10; ll ans=0; while(l<r){ int mid = (l+r+1)>>1; ll tem = check(mid); if(tem==-1) l=mid; else{ ans=tem; r=mid-1; } } cout<<ans<<"\n"; } return 0; }