华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1548|回复: 2
打印 上一主题 下一主题

P1080 国王游戏

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-4-22 13:25:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目描述
恰逢 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 提高组 第一天 第二题
回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
发表于 2018-9-26 20:34:06 | 只看该作者
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int now[20010],sum[20010],ans[20010],add[20010];
  4. struct Node {
  5.     int a;
  6.     int b;
  7.     long long a_b;
  8. }node[1010];
  9. void times(int x) {
  10.     memset(add,0,sizeof(add));
  11.     for(int i=1;i<=ans[0];i++) {
  12.         ans[i]=ans[i]*x;
  13.         add[i+1]+=ans[i]/10;
  14.         ans[i]%=10;
  15.     }
  16.     for(int i=1;i<=ans[0]+4;i++) {
  17.         ans[i]+=add[i];
  18.         if(ans[i]>=10) {
  19.             ans[i+1]+=ans[i]/10;
  20.             ans[i]%=10;
  21.         }
  22.         if(ans[i]!=0) {
  23.             ans[0]=max(ans[0],i);
  24.         }
  25.     }
  26.     return ;
  27. }
  28. void divition(int x) {
  29.     memset(add,0,sizeof(add));
  30.     int q=0;
  31.     for(int i=ans[0];i>=1;i--) {
  32.         q*=10;
  33.         q+=ans[i];
  34.         add[i]=q/x;
  35.         if(add[0]==0 && add[i]!=0) {
  36.             add[0]=i;
  37.         }
  38.         q%=x;
  39.     }
  40.     return;
  41. }
  42. bool compare() {
  43.     if(sum[0]==add[0]) {
  44.         for(int i=add[0];i>=1;i--) {
  45.             if(add[i]>sum[i]) return 1;
  46.             if(add[i]<sum[i]) return 0;
  47.         }
  48.     }
  49.     if(add[0]>sum[0]) return 1;
  50.     if(add[0]<sum[0]) return 0;
  51. }
  52. void cp () {
  53.     memset(sum,0,sizeof(sum));
  54.     for(int i=add[0];i>=0;i--)sum[i]=add[i];
  55.     return ;
  56. }
  57. bool cmp(Node a,Node b) {
  58.     return a.a_b<b.a_b;
  59. }
  60. int main() {
  61.     int n;
  62.     cin>>n;
  63.     for(int i=0;i<=n;i++) {
  64.         cin>>node[i].a>>node[i].b;
  65.         node[i].a_b=node[i].a*node[i].b;
  66.     }
  67.     sort(node+1,node+n+1,cmp);
  68.     ans[0]=1,ans[1]=1;
  69.     for(int i=1;i<=n;i++)
  70.     {
  71.         times(node[i-1].a);
  72.         divition(node[i].b);
  73.         if(compare())cp();
  74.     }
  75.     for(int i=sum[0];i>=1;i--)
  76.         cout<<sum[i];
  77.     return 0;
  78. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
板凳
发表于 2018-10-18 22:33:03 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n,s,l[40000],len=1,ans[40000];
  5. struct hands
  6. {
  7.     int a,b;
  8. }h[1001];
  9. bool operator< (hands x,hands y)
  10. {
  11.     return x.a*x.b<y.a*y.b;
  12. }
  13. int main()
  14. {
  15.     cin>>n;
  16.     for(int i=0;i<=n;i++)cin>>h[i].a>>h[i].b;
  17.     sort(h+1,h+n+1);
  18.     l[1]=h[0].a;
  19.     for(int i=1;i<n;i++)
  20.     {
  21.         for(int j=1;j<=len;j++)l[j]*=h[i].a;
  22.         for(int j=1;j<=len;j++)
  23.         {
  24.             l[j+1]+=l[j]/10;
  25.             l[j]%=10;
  26.         }
  27.         len++;
  28.         while(l[len]>9)
  29.         {
  30.             l[len+1]+=l[len]/10;
  31.             l[len]%=10;
  32.             len++;
  33.         }
  34.         if(!l[len])len--;
  35.     }
  36.     for(int i=len;i>=1;i--)
  37.     {
  38.         s=10*s+l[i];
  39.         ans[i]=s/h[n].b;
  40.         s%=h[n].b;
  41.     }
  42.     while(!ans[len])len--;
  43.     if(len<=0)cout<<1;
  44.     else for(int i=len;i>=1;i--)cout<<ans[i];
  45.     return 0;
  46. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-1 22:36 , Processed in 0.271407 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表