POJ 2976 Dropping tests

来源:互联网 发布:全国68所网络教育 编辑:程序博客网 时间:2024/06/05 19:56

POJ 2976 Dropping tests

题意:给定n组数据,取其中k组数据,求最大的平均值,平均值为.

思路:假设我们选了其中的k组数据,那么它们的单位值是∑ai/∑bi,接着可以变成判断是否存在k/满足条件:∑ai/∑bi≥x,变形不等式为∑(ai-x*bi)≥0。

因此可以对(ai-x*bi)的值进行排序贪心地进行选取。因此就变成了C(x)=((ai-x*bi)从大到小排列中的前k个的和不小于0)

对x值进行二分,在0到1之间取值。

AC代码:

import java.util.Arrays;import java.util.Scanner;public class Main{static Scanner scan=new Scanner(System.in);public static void main(String[] args){while(scan.hasNext()){int n=scan.nextInt(),k=scan.nextInt();if(n==0 && k==0) break;int a[]=new int[n],b[]=new int[n];for(int i=0;i<n;i++) a[i]=scan.nextInt();for(int i=0;i<n;i++) b[i]=scan.nextInt();double c[]=new double[n];double l=0,r=1,mid=(l+r)/2,eps=1e-4,sum=0;for(;r-l>eps;mid=(l+r)/2){for(int i=0;i<n;i++) c[i]=a[i]-mid*b[i];Arrays.sort(c);sum=0;for(int i=k;i<n;i++) sum+=c[i];if(sum>=0) l=mid;else r=mid;}System.out.println(Math.round(mid*100));}}}

0 0