
流程图

求解代码
java
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();
}