poj 2976 Dropping tests (二分查找)

对于(a1+a2+....an)/(b1+b2........bn)=x,可以去掉其中k个数据 ,求x的最大值。

其实可以二分查找答案,我们只需要判断当平均分为x时,可不可行。

我们可以对上面的式子进行变形。。。。

a1+a2+.....an>=b1*x + b2*x +.......bn*x

继续变形。。。

(a1-b1*x)+(a2-b2*x)+.......(an-bn*x)>=0;

我们令c1=(a1-b1*x)   c2=(a2-b2*x)    ....cn=(an-bn*x)

对c1,c2,...cn进行排序,只取最大的n-k个之和,判断是否大于0。。。

PS:对于输出距离最近的整数,我们可以把答案加上0.5,然后取整(强制转化成int),就是答案,

比如83.3加上0.5=83.8 取整=83      比如是83.6 加上0.5=84.1  取整=84

#include<stdio.h>
#define exp 1e-3
#define N 1000+16
int n,k;
double c[N],a[N],b[N];
void qsort(double a[],int l,int r)//快速排序
{
	int i,j;
	double x;
	if(l<r)
	{
		i=l;
		j=r;
		x=a[i];
		while(i<j)
		{
			while(i<j&&a[j]<=x)
				j--;
			if(i<j)
				a[i++]=a[j];
			while(i<j&&a[i]>x)
                i++;
			if(i<j)
				a[j--]=a[i];
		}
		a[i]=x;
		qsort(a,l,i-1);
		qsort(a,i+1,r);
	}
	return ;
}
int judge(double x)//判断平均分为x时,可不可行
{
	int i;
	double sum=0;
	for(i=0;i<n;i++)
	{
		c[i]=100*a[i]-x*b[i];

	}
	qsort(c,0,n-1);
	for(i=0;i<n-k;i++)
	{
		sum+=c[i];

	}
	return sum>=0;
}
int main(void)
{
	int i;
    double l,r,m;
	while(~scanf("%d%d",&n,&k)&&n+k!=0)
	{
         for(i=0;i<n;i++)
			 scanf("%lf",&a[i]);
		 for(i=0;i<n;i++)
			 scanf("%lf",&b[i]);
		 l=0;r=100;
		 while(r-l>exp)//二分查找
		 {
			 m=(l+r)/2;
			 if(judge(m))
				 l=m;
			 else
				 r=m;
		 }
		 printf("%d\n",(int)(l+0.5));		
	}
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值