公式还是很好推的,关键是这题竟然是高精度,,,手写小数高精度还是算了,用JAVA吧0 0。。
import java.io.*;
import java.math.*;
import java.util.*;
class Bucket {
BigDecimal a, b, k;
Bucket() {}
Bucket(BigDecimal _a, BigDecimal _b, BigDecimal _k) {
a = _a;
b = _b;
k = _k;
}
}
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int t, n, v, maxa;
int[] a = new int[50];
int[] b = new int[50];
t = cin.nextInt();
while(t > 0) {
t--;
maxa = 0;
n = cin.nextInt();
v = cin.nextInt();
for(int i = 0; i < n; i++)
a[i] = cin.nextInt();
for(int i = 0; i < n; i++) {
b[i] = cin.nextInt();
if(b[i] != 0 && maxa < a[i])
maxa = a[i];
}
if(maxa >= v)
System.out.println(-1);
else {
List<Bucket> list= new ArrayList<Bucket>();
BigDecimal ans = BigDecimal.ZERO;
BigDecimal nv = BigDecimal.valueOf(v);
for(int i = 0; i < n; i++) {
Bucket tmp = new Bucket(BigDecimal.valueOf(a[i]), BigDecimal.valueOf(b[i]),
BigDecimal.valueOf(b[i]).divide(BigDecimal.valueOf(a[i]), 200, BigDecimal.ROUND_HALF_UP));
list.add(tmp);
}
Collections.sort(list, new Comparator<Bucket>() {
public int compare(Bucket arg0, Bucket arg1) {
return arg0.k.compareTo(arg1.k);
}
});
for(int i = 0; i < n; i++) {
Bucket tmp = list.get(i);
if(tmp.b.compareTo(BigDecimal.ZERO) != 0) {
ans = ans.add((tmp.b.add(ans.multiply(tmp.a))).divide(nv.subtract(tmp.a), 200,
BigDecimal.ROUND_HALF_UP));
}
}
ans = ans.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println(ans);
}
}
cin.close();
}
}