1、比较相邻两个大臣,要他们二者的顺序下的最大值最小,则推公式可得,谁的左手右手乘积越小在前,则二者的最大值最小
所以即对大臣们进行乘积从小到大排即可
2、处理过程中的高精度,需要注意除法需要消去前导0
#include <bits/stdc++.h>
using namespace std;
const int MA = 1010;
pair<int,int> PDD[MA];//对每位大臣的金币的乘积进行排序
vector <int> AA;//表示前面的和
vector <int> MAXN;
void output(){ //输出高精度数
for (int i = MAXN.size()-1; i >= 0; i--){
printf("%d",MAXN[i]);
}
puts("");
}
vector <int> maxz(vector <int> a,vector <int> b){ //得两个高精度数最大值
if(a.size() > b.size()) return a;
if(a.size() < b.size()) return b;
//转换
if(vector <int>(a.rbegin(),a.rend()) > vector <int>(b.rbegin(),b.rend()))
return a;
return b;
}
vector <int> muc(vector <int> a, int b){ //高精度乘非高精
vector <int> c;
int t = 0;
for (int i = 0; i < a.size(); i++){
t += a[i] * b;//当位乘
c.push_back(t%10);
t/=10;
}
while(t){
c.push_back(t%10);
t/=10;
}
return c;
}
vector <int> div(vector <int> a, int b){ //高精度除非高精
vector <int> c;
int ok = 0;
for (int i = a.size()-1,chu = 0; i>= 0; i--){
chu = chu * 10+a[i];
int x = chu/b ;
if(x && !ok){
ok = 1;
}
if(ok){
c.push_back(x);
chu %= b;
}
}
if(!ok) c.push_back(0);
reverse(c.begin(),c.end());
return c;
}
int main()
{
int n;
scanf("%d",&n); n++;
for (int i = 0; i < n; i++){
int a,b;
scanf("%d%d",&a,&b);
PDD[i] = {a*b,b};//b代表右手
}
sort(PDD+1,PDD+n);
AA.push_back(PDD[0].first/PDD[0].second);//存国王左手
MAXN.push_back(0);
for (int i = 1; i < n; i++){
vector <int> C = div(AA,PDD[i].second);
MAXN = maxz(MAXN,C);
AA = muc(AA,PDD[i].first/PDD[i].second);
}
output();
return 0;
}