蓝桥杯 - 国王游戏
国王游戏
题目描述
恰逢 H 国国庆,国王邀请 nn 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 nn 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
输入描述
第一行包含一个整数 nn,表示大臣的人数。
第二行包含两个整数 aa 和 bb,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 nn 行,每行包含两个整数 aa 和 bb,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
其中, 1 <= n <= 1000,0 < a,b < 10^41。
输出描述
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
输入输出样例
输入
3
1 1
2 3
7 4
4 6
输出
2
题目解析
对于其中两个大臣位置的交换只会影响这两个大臣会得到的金币的数量(你想想是不是这个道理)。这样我们就设这两位大臣本来是在第i和第i+1的位置,两人左右手数字为(ai,bi)和(ai+1,bi+1),两人获得金币数量为wi和wi+1,T为前i-1个人左手数字的乘积。
那么交换前:wi=T/bi wi+1=T*ai/bi+1
交换后二者位置互换:wi=T/bi+1 wi+1=T*ai+1/bi(其中wi和wi+1为二者换位置后的i,而(a,b)没换)
这样二者的ans=max(wi,wi+1)可写为:ans1=max(k1,k2) ans2=max(k3,k4)
而k1必小于k4且k2必大于k3(为啥你自己看看这些值的表达式),那么要使ans1<ans2就得k2<k4这样就有ai * bi<ai+1 * bi+1
综上所述,我们可以知道为了 ans取到最小值,我们需要将ai * bi较小的放在前面,那么我们以ai * bi为关键字排序即可。
题目代码
#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;
typedef struct {
int right;
int left;
ll mul;
}Cell;
bool Compare(Cell a, Cell b) {
return a.mul < b.mul;
}
int main()
{
Cell cells[1000];
int n;
cin >> n;
Cell king;
cin >> king.left >> king.right;
ll Mul=king.left;
ll max = 0;
for (int i = 0; i < n; i++) {
cin >> cells[i].left >> cells[i].right;
cells[i].mul = cells[i].left * cells[i].right;
}
sort(cells, cells+n,Compare);
for (int i = 0; i < n; i++) {
ll res = Mul / cells[i].right;
if (max < res) max = res;
Mul *= cells[i].left;
}
cout << max <<fixed<< endl;
return 0;
}
注:这里的代码没有实现高精度,所以当数字太大导致long long 无法存储时就会出现错误,因此这属于不完全代码。但是这个思路可以用python实现因为python可以实现大位数计算。至于C++的高精度计算就以后再整叭~
高精度问题已用python解决!(附代码)
import os
import sys
import array
N=int(input())
s=input().split()
S=int(s[0])
T=int(s[1])
a = []#一个列表
for i in range(1,N+1):
k=input().split()
temp=[int(k[0]) ,int(k[1])]
a.append(temp)#列表里面套列表
a.sort(key=lambda x: x[0]*x[1])#按照左右数字乘积的大小来排序
ans=0
for i in range(0,N):
if(S//(a[i])[1]>ans):
ans=S//(a[i])[1]#S//(a[i])[1]其中//是取整除 - 返回商的整数部分(向下取整)
S*=(a[i])[0]
print(ans)

浙公网安备 33010602011771号