zoukankan      html  css  js  c++  java
  • 【题解】洛谷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];//倒序输出 
    }
  • 相关阅读:
    jQuery小技巧
    HTML5 学习指导
    js对象排序&&倒序
    JS 中如何判断字符串类型的数字
    JavaScript中function的多义性
    JS 继承
    45.oracle表类型、数据拆分、表分区
    44.oracle表空间的使用
    43.oracle同义词
    42.oracle物化视图
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9888087.html
Copyright © 2011-2022 走看看