AcWing 国王游戏
Description
- 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。
Input
- 第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
Output
- 输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
Sample Input
3 1 1 2 3 7 4 4 6
Sample Output
2
Data Size
- 1≤n≤1000
0<a,b<10000
题解:
- 贪心。
- 证明用微扰法,挺容易的。详细过程见链接。我想表达的跟这位大大差不多。
我可以说是因为公式太多我懒吗… …- 还有,我没有写高精度,所以只能拿60pts。
懒是原罪QAQ
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 10005
#define int unsigned long long
using namespace std;
struct A {int l, r;} a[N];
int n, l0, r0, mul, ans;
bool cmp(A x, A y) {return x.l * x.r < y.l * y.r;}
signed main()
{
cin >> n >> l0 >> r0;
for(int i = 1; i <= n; i++) cin >> a[i].l >> a[i].r;
sort(a + 1, a + 1 + n, cmp);
mul = l0, ans = mul / a[1].r;
for(int i = 2; i <= n; i++)
mul *= a[i - 1].l, ans = max(ans, mul / a[i].r);
cout << ans;
return 0;
}
原文地址:https://www.cnblogs.com/BigYellowDog/p/11296753.html
时间: 2024-10-15 03:46:26