Loj #149. 01 分数规划(01分数规划模板题)

链接

题意:

在这里插入图片描述

题解:

详细解法看这里
这里说个点,eps一定要开足够小,我一开始开的1e-5,结果就过了90%的数据,开到1e-7就足够了

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){
    
    
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){
    
    if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
double eps=1e-7;
const int maxn=1e5+9;
double a[maxn],b[maxn];
double dis[maxn];
int n,k;
bool check(double mid)
{
    
    
	double ans=0;
	for(int i=1;i<=n;i++)dis[i]=a[i]-mid*b[i];
	sort(dis+1,dis+1+n,greater<double>());
	for(int i=1;i<=k;i++)ans+=dis[i];
	//for(int i=n;i>n-k;i--)ans+=dis[i];
	if(ans>eps)return 0;
	return 1;
}
int main()
{
    
    
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	double l=0,r=1000;
	while(r-l>eps)
	{
    
    
		double mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid;
	}
	printf("%.4f",l);
	return 0;
}

[POJ2976]Dropping tests

这个题的话稍微改改代码就OK了,这个题是选n-k个

猜你喜欢

转载自blog.csdn.net/qq_35975367/article/details/115142251