牛客-小咪买东西(二分01规划)

https://ac.nowcoder.com/acm/problem/14662

#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<iomanip>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
const double eps=1e-8;
int t,n,k;
double v[maxn],c[maxn],a[maxn]={
    
    0};

bool check(double l){
    
    
	double ans=0;
	for(int i=0;i<n;i++) a[i]=v[i]-c[i]*l;
	sort(a,a+n);
	for(int i=n-1;i>=n-k;i--) ans+=a[i];
	//cout<<l<<" "<<ans<<endl;
	return ans>=0;
}

int main(){
    
    
	cin>>t;
	while(t--){
    
    
		//对数据初始化 
		cin>>n>>k;
		for(int i=0;i<n;i++)
			cin>>c[i]>>v[i];
		double l=0,r=1e9; 
		while(abs(r-l)>eps){
    
    
			double mid=l+(r-l)/2.0;
			if(check(mid)) l=mid;
			else r=mid;
		}
		cout<<(int)max(l,r)<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/Joekiccer/article/details/121412492