博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
國王遊戲(2012年NOIP全国联赛提高组)
阅读量:6677 次
发布时间:2019-06-25

本文共 2455 字,大约阅读时间需要 8 分钟。

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

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

输入描述 
Input Description

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

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

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

输出描述 
Output Description

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

金币数。

样例输入 
Sample Input

3

1 1

2 3

7 4

4 6

样例输出 
Sample Output

2

数据范围及提示 
Data Size & Hint

【输入输出样例说明】

按 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。

 

算出每個大臣左右手數字之積,然後由小到大排序。之後捋一遍就是了。不要問我為什麼這麼貪心,貪心嗎,總是憑感覺的~

這裡數據會變得很大(超long long),需要用到高精,不會的多練練吧~

代碼實現:

1 #include
2 #include
3 #include
4 using namespace std; 5 struct nata{ 6 int a,b,c; 7 }s[3000]; 8 int n,d,ans[6000],ys[6000],shang[6000],bcs[6000]; 9 int comp(const nata&x,const nata&y){10 return x.c
shang[0]) return 0;15 for(int i=ans[0];i>0;i--){16 if(shang[i]>ans[i]) return 1;17 if(shang[i]
0;i--){25 shang[i]=bcs[i]/s[x].b;bcs[i]%=s[x].b;26 if(i>1) bcs[i-1]+=10*bcs[i]; 27 }28 shang[0]=ys[0];29 while(!shang[shang[0]]&&shang[0]>0) --shang[0];30 if(bj()) for(int i=0;i<=shang[0];i++) ans[i]=shang[i];31 for(int i=1;i<=ys[0];i++)32 ys[i]*=s[x].a;33 for(int i=1;i<=ys[0];i++){34 if(ys[i]>9){35 ys[i+1]+=ys[i]/10;36 ys[i]%=10;37 if(i+1>ys[0]) ys[0]++;38 }39 }40 }41 int main(){42 scanf("%d%d%d",&n,&ys[1],&s[0].b);ys[0]=1;43 for(int i=1;i<=n;i++){44 scanf("%d%d",&s[i].a,&s[i].b);45 s[i].c=s[i].a*s[i].b;46 }47 sort(s+1,s+n+1,comp);48 for(int i=1;i<=n;i++) ngs(i);49 d=ans[0];50 while(!ans[d]) --d;51 for(int i=d;i>0;i--)52 printf("%d",ans[i]);53 printf("\n");54 return 0;55 }

很經典的一道貪心題~

转载于:https://www.cnblogs.com/J-william/p/6037699.html

你可能感兴趣的文章
服务器部署十大问题系列三:创建文档与旧设备处理
查看>>
零基础学习SVN之(三):可视化SVN的使用
查看>>
IOS开发之显示微博表情
查看>>
Snap首份季度财报或让投资人失望 股价被指偏高
查看>>
新来的NB-IoT为什么这么NB?
查看>>
DoCoMo跳过HSPA+ 力争全球首家推出LTE商用服务
查看>>
Mozilla火狐发布最新计划:用户隐私和安全为发展核心
查看>>
金融行业解决方案
查看>>
[原创]分析解决lvs fullnat模式下后端服务器获取真实IP地址异常问题
查看>>
《Arduino开发实战指南:LabVIEW卷》——3.3 LabVIEW的常用工具及调试工具
查看>>
中国正式启动5G技术研发试验:力争2020年商用
查看>>
《精解 Windows 10》——第2章 Modern 2.0界面体验 2.1Modern 2.0界面
查看>>
《Android深度探索(卷1):HAL与驱动开发》——1.5节如何学习Linux驱动开发
查看>>
《Photoshop七大核心技术》—第2课Photoshop七大核心技术
查看>>
《动手玩转Arduino》——10.5 展望
查看>>
大数据开发套件-数据集成-云mongo跨区域如何同步到Maxcompute
查看>>
人工智能第三次黄金时代,藏在全球数亿摄像头里?
查看>>
RegularJS 0.2.12 发布,JavaScript MVC 框架
查看>>
根据《网络安全法》要求全面提升企业安全能力
查看>>
最新 Win10 测试版提供 Ubuntu 16.04 镜像
查看>>