问题描述 有n个正方体箱子(编号为1-n),每个箱子都有一个重量wi以及一个承重系数si,你需要把它们全部堆叠在一起,就像一个垂直的高塔。
箱子有可能因为承受的重量太多而被压扁,可以用风险系数来衡量被压扁的概率。每个箱子的风险系数由它上面所有箱子的总重量总重量(不包括它本身)减去它的承重系数来决定。很明显,风险系数越大,该箱子被压扁的概率就越大。
你的任务是确定箱子应该按什么顺序进行堆叠,才能使得所有箱子风险系数中的最大值尽可能小。
输入格式 第一行输入整数n ,表示箱子的数量。
接下来 n 行,每行输入两个整数,第 i 行表示第 i 个箱子的重量wi以及它的称重系数si 。
输出格式 输出一个整数,表示最大风险系数的最小可能值。
#include <bits/stdc++.h>
using namespace std;
long long a[50005] , b[50005] , c[50005] , ans[50005];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i = 1 ; i <= n ; ++i) {
cin >> a[i] >> b[i];
c[i] = a[i] * b[i];
}
for(int i = 1 ; i <= n - 1 ; ++i) {
for(int j = 1 ; j <= n - 1 ; ++j) {
if(c[j] < c[j + 1]) {
swap(c[j] , c[j + 1]);
swap(a[j] , a[j + 1]);
swap(b[j] , b[j + 1]);
}
}
}
int sum = -1;
for(int i = 1 ; i <= n ; ++i) {
for(int j = n ; j >= i + 1 ; --j) {
ans[i] += a[j];
}
if(ans[i] - b[i] >= sum) sum = ans[i] - b[i];
}
cout << sum << endl;
return 0;
}