#include <stdio.h>
#include <stdlib.h>
// 定义大臣结构体
typedef struct
{
int a;
int b;
long long prod; // 用于排序的乘积 a * b
} Minister;
// 比较函数:按 a * b 升序排列
int compare(const void* p1, const void* p2)
{
Minister* m1 = (Minister*)p1;
Minister* m2 = (Minister*)p2;
if (m1->prod < m2->prod) return -1;
if (m1->prod > m2->prod) return 1;
return 0;
}
int main()
{
int n;
int a0, b0;
// 输入人数和国王的数字
scanf("%d", &n);
scanf("%d %d", &a0, &b0);
Minister m[61];
for (int i = 0; i < n; i++)
{
scanf("%d %d", &m[i].a, &m[i].b);
m[i].prod = (long long)m[i].a * m[i].b;
}
// 执行贪心排序
qsort(m, n, sizeof(Minister), compare);
long long current_left_prod =a0; // 处理中间乘积
long long max_gold = 0;
for (int i = 0; i < n; i++)
{
// 计算当前大臣获得的金币数
long long current_gold = (long long)(current_left_prod / m[i].b);
// 更新最大值
if (current_gold > max_gold)
{
max_gold = current_gold;
}
// 累乘左手数字,为下一位大臣做准备
current_left_prod *= m[i].a;
}
printf("%lld\n", max_gold);
return 0;
}
主要是贪心算法的使用以及合理的看懂公式:
公式所表达的意思是对于第i个大臣的金币数等于前面所有人的左手数乘积除以他自己的右手数。那么如何才能达到最优解呢?这时候可以想到利用左手右手乘积进行升序排序排列,在进行循环即可求出最小。

京公网安备 11010502036488号