需要注意的是调用Arrays.sort()函数时要重写compareTo函数,附上AC代码:
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;
import java.util.Scanner;
class DP implements Comparable<DP>{
double y;
int index;
@Override
public int compareTo(DP o) {
if(o.y > this.y) return 1;
return 0;
}
}
public class Main {
static int[] w;
static int[] v;
static int n;
static int k;
static DP[] dp;
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while(in.nextToken() != StreamTokenizer.TT_EOF){
n = (int)in.nval;
in.nextToken();
k = (int)in.nval;
w = new int[n+1];
v = new int[n+1];
dp = new DP[n];
for(int i = 1; i<=n; i++){
in.nextToken();
v[i] = (int)in.nval;
in.nextToken();
w[i] = (int)in.nval;
dp[i-1] = new DP();
}
double low = 0;
double up = Integer.MAX_VALUE;
for(int i = 0; i<50; i++){
double mid = (low+up)/2;
if(judge(mid)) low = mid;
else up = mid;
}
for(int i = 0; i<k; i++){
if(i != 0) out.print(" ");
out.print(dp[i].index);
}
out.println();
out.flush();
}
}
private static boolean judge(double x) {
for(int i = 1; i<=n; i++){
dp[i-1].y = v[i] - x*w[i];
dp[i-1].index = i;
}
Arrays.sort(dp);
double sum = 0;
for(int j=0; j<k; j++){
sum += dp[j].y;
}
return sum>=0;
}
}