NOIP201206国王游戏 |
难度级别: A; 编程语言:不限;运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后, 让这n位大臣排成一排,国王站在队伍的最前面。 排好队后,所有的大臣都会获得国王奖赏的若干金币, 每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
|
输入
|
第一行包含一个整数n,表示大臣的人数。第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
|
输出
|
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
|
输入示例
|
3
1 1 2 3 7 4 4 6 |
输出示例
|
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。 【数据范围】1≤n≤1,000,0<a、b<10000。 |
思路:一道典型的贪心,不过要打高精,不会懒得打。想要AC的人自己往上打高精,不然只能A六个点。直接上参考代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long n,l[10006],r[10006],kl,kr; 4 long long ans,sum[10005]; 5 int main() 6 { 7 scanf("%lld",&n); 8 scanf("%lld%lld",&kl,&kr); 9 for(long long i=1;i<=n;i++) 10 { 11 scanf("%lld%lld",&l[i],&r[i]); 12 } 13 for(long long i=1;i<=n;i++) 14 { 15 for(long long j=1;j<=i;j++) 16 { 17 if(l[i]*r[i]<l[j]*r[j])//按左右手乘积的大小排序 18 { 19 swap(l[i],l[j]); 20 swap(r[i],r[j]); 21 } 22 } 23 } 24 for(int i=1;i<=n;i++) 25 { 26 sum[i]=kl;//统计奖赏 27 for(int j=1;j<i;j++) 28 { 29 sum[i]*=l[j]; 30 } 31 sum[i]/=r[i]; 32 } 33 for(int i=1;i<=n;i++) 34 { 35 ans=max(sum[i],ans);//统计获得奖赏最多大臣得了多少钱 36 } 37 printf("%lld",ans);//输出 38 return 0; 39 }