小咪买东西
题目分析:
1.总价值/总花费=max,设总价值为b,总花费为a,答案为未知:b/a = x
2. 对x进行二分处理(取值范围(0,inf))
3. 取k个物品,那么进行排序取(bi/ai)前k个最大的
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define mm(a,x) memset(a,x,sizeof a)
#define mk make_pair
#define ll long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define lowbit(x) (x) & (-x)
#define eps 1e-6
const int N = 1e4 + 10;
int t;
int n,m;
struct Node{
double a,b,c;
}node[N];
bool cmp(Node a,Node b){
return a.c > b.c;
}
bool check(double x){
for(int i = 1; i <= n; i ++ ){
node[i].c = node[i].b - node[i].a * x;
}
sort(node + 1, node + n + 1,cmp);
double ans = 0;
for(int i = 1; i <= m; i ++){
ans += node[i].c;
}
return ans >= 0;
}
int main() {
cin >> t;
while(t -- ){
cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
double a,b; cin >> a >> b;
node[i] = {a,b};
}
double l = 0,r = inf;
while(r - l > eps){
double mid = (l + r) / 2.0;
if(check(mid)) l = mid;
else r = mid;
}
printf("%d\n",(int)(l + eps));
}
return 0;
}


京公网安备 11010502036488号