公式还是很好推的,关键是这题竟然是高精度,,,手写小数高精度还是算了,用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(); } }