求助站外题,玄关
  • 板块灌水区
  • 楼主RockyQ012
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/31 17:03
  • 上次更新2024/8/31 17:08:14
查看原帖
求助站外题,玄关
1299348
RockyQ012楼主2024/8/31 17:03

问题描述 有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;
}
2024/8/31 17:03
加载中...