zoukankan      html  css  js  c++  java
  • 洛谷—— P1080 国王游戏

    https://www.luogu.org/problem/show?pid=1080

    题目描述

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

    国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

    输入输出格式

    输入格式:

    第一行包含一个整数 n,表示大臣的人数。

    第二行包含两个整数 a和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

    接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

    输出格式:

    输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

    输入输出样例

    输入样例#1:
    3 
    1 1 
    2 3 
    7 4 
    4 6 
    输出样例#1:
    2

    说明

    【输入输出样例说明】

    按 1、2、3 号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按 1、3、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按 2、1、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按 2、3、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;

    按 3、1、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

    按 3、2、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。

    因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。

    【数据范围】

    对于 20%的数据,有 1≤ n≤ 10,0 < a、b < 8;

    对于 40%的数据,有 1≤ n≤20,0 < a、b < 8;

    对于 60%的数据,有 1≤ n≤100;

    对于 60%的数据,保证答案不超过 10^9;

    对于 100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。

    NOIP 2012 提高组 第一天 第二题

    贪心

    设 i, j=i+1     tot为i之前的所有人的左手积   Li,Ri Lj Rj

    则 j 的奖赏为 tot*Li/Rj     若交换 i与j     i  的奖赏为 tot*Lj/Ri 

    尽量使前面的大臣奖赏少的话    应是   tot*Li/Rj < tot*Lj/Ri    即 Li*Ri<Lj*Rj

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 const int N(1001);
     7 int n,ans,tot=1;
     8 
     9 struct Node
    10 {
    11     int l,r;
    12 }p[N];
    13 bool cmp(Node a,Node b)
    14 {
    15     return a.l*a.r<b.l*b.r;
    16 }
    17 
    18 int main()
    19 {
    20     scanf("%d",&n);
    21     scanf("%d%d",&p[0].l,&p[0].r);
    22     for(int i=1;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r);
    23     sort(p+1,p+n+1,cmp);
    24     for(int i=0;i<n;i++)
    25     {
    26         tot=(long long)tot*p[i].l;
    27         ans=max(ans,tot/p[i+1].r);
    28     }
    29     printf("%lld",ans);
    30     return 0;
    31 }
    60

    高精AC、、、数组开大、、e xin

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 
     5 using namespace std;
     6 
     7 const int N(1001);
     8 int n;
     9 
    10 struct Node
    11 {
    12     int l,r;
    13 }p[N];
    14 bool cmp(Node a,Node b)
    15 {
    16     return a.l*a.r<b.l*b.r;
    17 }
    18 
    19 struct Gj
    20 {
    21     int num[23333];
    22     void init()
    23     {
    24         memset(num,0,sizeof(num));
    25         num[0]=1; num[1]=1;
    26     }
    27     void mul(int x)
    28     {
    29         for(int i=1,ove=0;i<=num[0];i++)
    30         {
    31             num[i]=num[i]*x+ove;
    32             if(num[i]>9)
    33             {
    34                 ove=num[i]/10;
    35                 num[i]%=10;
    36                 num[0]=max(num[0],i+1);
    37             }
    38             else ove=0;
    39         }
    40         for(;!num[num[0]];) num[0]--;
    41     }
    42     void del(int x)
    43     {
    44         for(int t=0,i=num[0];i;i--)
    45         {
    46             int tt=num[i];
    47             num[i]=(t*10+tt)/x;
    48             t=(t*10+tt)%x;
    49         }
    50         for(;!num[num[0]];) num[0]--;
    51     }
    52     void print()
    53     {
    54         for(int i=num[0];i;i--) printf("%d",num[i]);
    55     }
    56     
    57 };
    58 Gj temp,ans;
    59 Gj MAX(Gj a,Gj b)
    60 {
    61     if(a.num[0]>b.num[0]) return a;
    62     else if(a.num[0]<b.num[0]) return b;
    63     for(int i=a.num[0];i;i--)
    64     {
    65         if(a.num[i]>b.num[i]) return a;
    66         else if(a.num[i]<b.num[i]) return b;
    67      }
    68      return a;
    69 }
    70 
    71 int main()
    72 {
    73     scanf("%d",&n);
    74     scanf("%d%d",&p[0].l,&p[0].r);
    75     for(int i=1;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r);
    76     sort(p+1,p+n+1,cmp);
    77     temp.init(); ans.num[0]=0;
    78     for(int i=0;i<n;i++)
    79     {
    80         temp.mul(p[i].l);
    81         Gj tmp=temp; tmp.del(p[i+1].r);
    82         ans=MAX(ans,tmp);
    83     }
    84     ans.print();
    85     return 0;
    86 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Spring MVC 教程(比较全的一篇文章了)
    关于F12的有效利用
    论运营工作与小区收垃圾的相似之处
    吴淞炮台湾湿地森林公园半日游
    真正的运营
    今天是入职通联3周年
    甲午年过临海
    购买vps创建账号后无法登录ftp
    prim+BFS
    最小生成树
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7338412.html
Copyright © 2011-2022 走看看