题目链接:http://poj.org/problem?id=2976
推荐阅读:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html
题型:01分数规划
题解:二分,详解可见以上推荐链接
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
public static double nextDouble() throws IOException {
in.nextToken();
return (double) in.nval;
}
public static String next() throws IOException {
in.nextToken();
return (String) in.sval;
}
static final double eps=0.000001;
public static void main(String[] args) throws IOException {
while(true) {
int n,k;
n=nextInt();
k=nextInt();
if(n==0&&k==0) {
break;
}
double a[]=new double [n];
double b[]=new double [n];
Double c[]=new Double [n];
for(int i=0;i<n;i++) {
a[i]=nextDouble();
}
for(int i=0;i<n;i++) {
b[i]=nextDouble();
}
double L=0.0;
double R=1.0;
double Mid,fl=0.0;
while(R-L>eps) {
Mid=(L+R)/2;
for(int i=0;i<n;i++) {
c[i]=a[i]-Mid*b[i];
}
CMP cmp=new CMP();
Arrays.sort(c,cmp);
fl=0.0;
for(int i=0;i<n-k;i++) {
fl+=c[i];
}
if(fl>0) {
L=Mid;
}else {
R=Mid;
}
}
System.out.println((int)(L*100+0.5));
}
}
}
class CMP implements Comparator<Double>{
@Override
public int compare(Double o1, Double o2) {
// TODO Auto-generated method stub
if(o1<o2) {
return 1;
}else if(o1>o2){
return -1;
}
return 0;
}
}