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

题目描述

恰逢 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%的数据,保证答案不超过 109;

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

NOIP 2012 提高组 第一天 第二题

经过凭感觉瞎搞大堆复杂的证明和推导,以每个人左手右手的乘积为标准,从小到大排序,然后从左往右乘起来,求在哪个位置可以取得最大值即可。

需要用到高精度。

↑高精度简直恶心,调了好久好久才对。

  1 /*by SilverN*/
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<cmath>
  7 using namespace std;
  8 int read(){
  9     int x=0,f=1;char ch=getchar();
 10     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 11     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
 12     return x*f;
 13 }
 14 struct HN{
 15     int a[2400];
 16     int len;
 17 }num,c,ans;
 18 bool cmp(HN a,HN b){
 19     if(a.len<b.len)return 1;
 20     for(int i=a.len;i;--i){
 21         if(a.a[i]<b.a[i])return 1;
 22         if(a.a[i]>b.a[i])return 0;
 23     }
 24     return 0;
 25 }
 26 void N_mul(int x){
 27     HN t;t.len=num.len+10;
 28     memset(t.a,0,sizeof t.a);
 29     for(int i=1;i<=num.len;i++){
 30         t.a[i]+=num.a[i]*x;
 31         t.a[i+1]=t.a[i]/10000;
 32         t.a[i]%=10000;
 33     }
 34 //    num.len+=10;
 35     while(t.a[t.len]==0 && t.len>1) t.len--;
 36     num=t;
 37     return;
 38 }
 39 void N_div(int x){
 40     memset(c.a,0,sizeof c.a);
 41     int tmp=0;
 42     c.len=0;
 43     for(int i=num.len;i;i--){
 44         tmp=10000*tmp+num.a[i];
 45         if(tmp>=x){
 46             if(!c.len) c.len=i;
 47             c.a[i]=tmp/x;
 48             tmp%=x;
 49         }
 50     }
 51     return;
 52 }
 53 void PRI(HN num){
 54     printf("%d",num.a[num.len]);
 55     for(int i=num.len-1;i>0;--i){
 56         printf("%d",num.a[i]/1000);
 57         printf("%d",num.a[i]/100%10);
 58         printf("%d",num.a[i]/10%10);
 59         printf("%d",num.a[i]%10);
 60     }
 61     printf("\n");
 62     return;
 63 }
 64 //
 65 struct node{
 66     int a,b;
 67     int c;
 68 }m[1200];
 69 void qsort(int l,int r){
 70     if(l<r){
 71         int i=l,j=r; node x=m[l];
 72         while(i<j){
 73             while(i<j && m[j].c>=x.c) j--;
 74             m[i]=m[j];
 75             while(i<j && m[i].c<=x.c) i++;
 76             m[j]=m[i];
 77         }
 78         m[i]=x;
 79         qsort(l,i-1);
 80         qsort(i+1,r);
 81     }
 82     return;
 83 }
 84 int n;
 85 int main(){
 86     n=read();
 87     scanf("%d",&num.a[1]);
 88     scanf("%d",&num.len);
 89     num.len=1;
 90     int i,j;
 91     for(i=1;i<=n;i++){
 92         m[i].a=read();
 93         m[i].b=read();
 94         m[i].c=m[i].a*m[i].b;
 95     }
 96     qsort(1,n);
 97 //    for(i=1;i<=n;i++)printf("%d ",m[i].c);printf("\n");
 98 //    for(i=1;i<=n;i++)printf("re:%d %d\n",m[i].a,m[i].b);
 99     ans.len=1;
100     ans.a[1]=0;
101     for(i=1;i<=n;i++){
102         N_div(m[i].b);
103 //        PRI(c);
104         if(cmp(ans,c))ans=c;
105 //        PRI(ans);
106 //        printf("num:");PRI(num);
107         N_mul(m[i].a);
108     }
109     PRI(ans);
110     return 0;
111 }
时间: 2024-10-12 08:15:13

[NOIP2012] 提高组 洛谷P1080 国王游戏的相关文章

洛谷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] 提高组 洛谷P1081 开车旅行

题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B

[NOIP2012] 提高组 洛谷P1084 疫情控制

题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境 城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点.但特别要注意的是, 首都是不能建立检查点的. 现在,在 H 国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队.一支军队可以在有道路连接的城

[NOIP2012] 提高组 洛谷P1083 借教室

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求

[NOIP2012] 提高组 洛谷P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

[NOIP2012] 提高组 洛谷P1079 Vigen&#232;re 密码

题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据, 记为 k. 在 Vigenère 密码中,密钥 k 是一个字母串,k=k1k2…kn.当明文 M=m1m

[NOIP2000] 提高组 洛谷P1019 单词接龙

题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连. 输入输出格式 输入格式: 输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单

[NOIP2009] 提高组 洛谷P1073 最优贸易

题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息 之后,便决定在旅游的