相邻交换法,设国王左右手上的数为$x,y$
考虑第 $i$ 和第 $i+1$ 个人,设:
次序为 $(i,i+1)$ 时:
交换之后,次序为 $(i+1,i)$ 时:
若 $ans1 < ans2$, 有:
将 max 拆成逻辑表达式:
由于 $a1\times b1<b1$ 为 False
,$b2<a2\times b2$ 为 True
,上式变为:
直接按上式 sort
即可
需要写高精*低精,以及高精/低精
int N;
struct Node{
double a,b;
bool operator < (const Node& n1) const {
return a*b < n1.a*n1.b;
return max(1/b, a/n1.b) < max(1/n1.b, n1.a/b);
}
} n[MAXM];
bigN ans;
string x,y;
//主函数
int main(){
cin>>N;
cin>>x>>y;
bigN s = bigN(x);
for(int i=1;i<=N;i++){
cin>>n[i].a>>n[i].b;
}
sort(n+1, n+1+N);
ans = s/n[1].b;
bigN ans1;
for(int i=2;i<=N;i++){
s = s * n[i-1].a;
ans1 = s / n[i].b;
ans = max(ans, ans1);
}
ans.print();
return 0;
}