luogu P1080国王游戏

贪心加高精

传送门:QWQ

先考虑两个人

a0 b0
p1 a1 b1
p2 a2 b2

那么满足:\(\huge ans1=\max(\frac{a0}{b1} , \frac{a0a1}{b2})\)

a0 b0
p2 a2 b2
p2 a1 b1

\(\huge ans2=\max(\frac{a0}{b2} , \frac{a0a2}{b1})\)

如果要让ans1<ans2

设 \(k1=\frac{a0}{b1} , k2=\frac{a0a1}{b2} , k3=\frac{a0}{b2} , k4=\frac{a0a2}{b1}\)

则 k1< k4

k2 > k3

如果要让ans1 k2

展开,得:\(\frac{a0a2}{b1} > \frac{a0a1}{b2}\)

移项得:\(a1b1<a2b2\)

根据冒泡排序

两个相邻交换一定使答案更差

所以可以根据ab的大小排序(下标排序)

然后就是麻烦的高精了

//自动无视c++14
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e4+5;
int n;
// The MIT License (MIT)

// Copyright (c) YEAR NAME

//  Permission is hereby granted, free of charge, to any person obtaining a
//  copy of this software and associated documentation files (the "Software"),
//  to deal in the Software without restriction, including without limitation
//  the rights to use, copy, modify, merge, publish, distribute, sublicense,
//  and/or sell copies of the Software, and to permit persons to whom the
//  Software is furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
//  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
//  DEALINGS IN THE SOFTWARE.
struct big{
    static const int base=10000;
    int a[2333];
    int len;
    big(){memset(a,'\000',sizeof a);len=1;}
    int& operator[](int x){return a[x];}
    big(int x){*this=x;}
    big& operator =(int x){
        *this=big();
        for(len=0;x;x/=base)a[++len]=x%base;
        if(!x)len=1;
        return *this;
    }
    friend big operator + (const big&a,const big& b){
        big c;
        c.len=max(a.len,b.len);
        for(int i=1;i<=c.len;++i){
            c[i+1]+=((c[i]+=(a.a[i]+b.a[i]))/base);
            c[i]%=base;
        }
        if(c[c.len+1])c.len++;
        return c;
    }
    friend big operator * (const big&a,const big& b){
        big c;
        c.len=a.len+b.len-1;
        for(int i=1;i<=a.len;++i){
            for(int j=1;j<=b.len;++j){
                c[i+j-1]+=a.a[i]*b.a[j];
                c[i+j]+=c[i+j-1]/base;
                c[i+j-1]%=base;
            }
        }
        while(c[c.len+1]){
            c[c.len+1]+=c[c.len]/base;
            c[c.len]%=base;
            c.len++;
        }
        return c;
    }
    friend big operator + (const big a,int b){big c(b);return a+c;}
    friend big operator * (const big a,int b){big c(b);return a*c;}
    friend bool operator < (const big & a,const big&b){
        if(a.len==b.len){
            for(int i=a.len;i;--i){
                if(a.a[i]!=b.a[i])return a.a[i]<b.a[i];
            }
        }else{
            return a.len<b.len;
        }
        return 0;
    }
    friend big operator / (const big& a,int x){
        big ans;
        ans.len=a.len;
        int jw=0;
        for(int i=ans.len;i;--i){
            ans[i]=(jw*base+a.a[i])/x;
            ((jw*=base)+=a.a[i])%=x;
        }
        while(!ans[ans.len]&&ans.len)ans.len--;
        return ans;
    }
    void print()const{printf("%d",a[len]);
        for(int i=len-1;i;i--){
            printf("%04d",a[i]);
        }
    }
    friend ostream& operator << (ostream& out,const big& a){
        a.print();
        return out;
    }
};
int a[maxn],b[maxn];
int bit[maxn];
big f[maxn];
big ans;
big mul(1);
int main(){
    cin>>n;
    for(int i=0;i<=n;++i){
        cin>>a[i]>>b[i];
        big x(a[i]),y(b[i]);
        f[i]=x*y;
        bit[i]=i;
    }
    sort(bit+1,bit+1+n,[](const int& a,const int& b){
        return f[a]<f[b];
    });
    for(int i=0;i<=n;++i){
        if(i)ans=max(ans,mul/b[bit[i]]);
        mul=mul*a[bit[i]];
    }
    ans.print();
    return 0;
}

原文地址:https://www.cnblogs.com/eric-walker/p/9535445.html

时间: 2024-11-05 16:05:29

luogu P1080国王游戏的相关文章

luogu P1080 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

洛谷P1080 国王游戏 高精度 贪心 数学推公式

洛谷P1080 国王游戏        数学推公式      高精度    贪心 然而这并不是我打出来的,抄题解... 将左手与右手的乘积从小到大排序,然后计算求最大值即可.(需要高精度) 证明: 1)知道,如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1.设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S. 则,ans1 = max{S / B[i], S * A[i] / B[i + 1]} 若交换

[贪心][高精]P1080 国王游戏(整合)

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

[NOIP2012] 提高组 洛谷P1080 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

P1080 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

洛谷 P1080 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大

AC日记——国王游戏 洛谷 P1080

国王游戏 思路: 贪心+高精: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 struct DataType { int a,b,key; bool operator<(const DataType pos)const { return key<pos.key; } }; struct DataType ai[maxn]; struct BintType { int len; char ch[

1198 国王游戏

1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自