算法 BISHI54货物堆放 流程图 求解代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 static class Goods{ long w; long v; long c; Goods(long w,long v,long c){ this.w = w; this.v = v; this.c = c; } } public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(br.readLine().trim()); Goods[] goods = new Goods[n]; long total = 0; for(int i=0;i<n;i++){ String[] str = br.readLine().trim().split("\\s+"); long w = Long.parseLong(str[0]); long v = Long.parseLong(str[1]); long c = Long.parseLong(str[2]); goods[i]=new Goods(w, v,c); total += v; } Arrays.sort(goods,(x,y)->Long.compare(x.c*y.w, y.c*x.w)); // 总实际体积 = 初始体积总和 - sumCW,因此最大化sumCW是实现最小体积的关键 long sumCW = 0; // 记录当前遍历商品的「上方总重量」,初始为0(第一个商品在最顶部,上方无重量) long upperWeight = 0; // 按"从上到下"的堆叠顺序遍历排序后的商品 for (Goods g : goods) { // 计算当前商品的压缩贡献值:c_i × 上方总重量(W_i) // 这里必须先计算贡献,再更新上方重量(避免把当前商品算入自己的上方) sumCW += g.c * upperWeight; // 更新上方总重量:当前商品会成为后续商品的"上方重量",需累加其重量 upperWeight += g.w; } long res = total -sumCW; out.println(res); out.flush(); out.close(); br.close(); }