• 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)


    次元传送门:;洛谷P1080

    思路

    我们模拟一下只有两个大臣的时候发现

    a1b1<a2b2​是ans1<ans2

    所以我们对所有大臣关于左右手之积进行排序

    得到最多钱的大臣就是最后一个(当有左手除右手向下取整为0的时候不一定 只有第二个点可以特判)

    所以答案用前n-1个人的左手相乘除以第n个人的右手

    记得高精

    代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define maxn 100010
    struct People
    {
        int l;
        int r;
        int sum;
    }p[maxn];
    int n,L=1;
    int g[maxn];//高精数组 
    bool cmp(People a,People b)
    {
        return a.sum<b.sum;
    }
    void mul(int x)//高精乘法 
    {
        for(int i=1;i<=L;i++) g[i]*=p[x].l;//先乘以每一位 
        for(int i=1;i<=L;i++)
        {
            g[i+1]+=(g[i]/10);//进位 
            g[i]%=10;
        }
        L++;//长度++ 
        while(g[L]>9)//延长长度 
        {
            g[L+1]+=(g[L]/10);//计算下一位的进位 
            g[L]%=10;
            L++;//长度++ 
        }
        if(g[L]==0) L--;//清除前导零 
    }
    void div()//高精除法 
    {
        for(int i=L;i>=1;i--)
        {
            g[i-1]+=((g[i]%p[n].r)*10);//计算下一位 
            g[i]/=p[n].r;
        }
        while(g[L]==0) L--;//清除前导零 
        if(L==0) cout<<1;//如果减完了就输出1 第二个测试点特判 
    }
    int main()
    {
        cin>>n>>p[0].l>>p[0].r;//国王不用排序 
        for(int i=1;i<=n;i++)
        {
            cin>>p[i].l>>p[i].r;
            p[i].sum=p[i].l*p[i].r;//计算左右手相乘 
        } 
        sort(1+p,1+p+n,cmp);//排序 
        g[1]=p[0].l;//初始化高精 
        for(int i=1;i<n;i++) mul(i);//乘以前n-1个人的左手 
        div();//除以第n个人的右手 
        for(int i=L;i>=1;i--) cout<<g[i];//倒序输出 
    }
  • 相关阅读:
    结果偏见 (行为经济学)
    天下没有免费的午餐
    双环学习
    信息对称、网络效应
    为什么说盲维是认知升级的重要概念?
    给思维找一个支点
    风险是一种商品
    认知方法论第一课
    A*算法深入
    A*算法入门
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9888087.html
Copyright © 2020-2023  润新知