【P1080】 国王游戏

最后更新于 2025-08-03 10:29:51
作者
分类 个人记录

相邻交换法,设国王左右手上的数为$x,y$

考虑第 $i$ 和第 $i+1$ 个人,设:

  • 第 $i$ 个人左右手数字为 $a1,b1$
  • 第 $i+1$ 个人左右手数字为 $a2, b2$
  • 前 $i-1$ 个人左手数字乘积乘以 $x$ 为常数 $C$

次序为 $(i,i+1)$ 时:

  • $ans1 = max(C/b1, C\times a1/b2)$

交换之后,次序为 $(i+1,i)$ 时:

  • $ans2 = max(C/b2, C\times a2/b1)$

若 $ans1 < ans2$, 有:

  • $max(b2, a1\times b1) < max(b1, a2\times b2)$

将 max 拆成逻辑表达式:

  • $max(b2, a1\times b1) <b1 \text{ or } max(b2,a1\times b1)<a2 \times b2$
  • $(b2<b1 \text{ and } a1\times b1<b1) \text{ or } (b2<a2 \times b2 \text{ and } a1\times b1<a2\times b2)$

由于 $a1\times b1<b1$ 为 False,$b2<a2\times b2$ 为 True,上式变为:

  • $a1\times b1 < a2\times b2$

直接按上式 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;
}