洛谷1080 国王游戏
来源:互联网 发布:高中数学算法初步教案 编辑:程序博客网 时间:2024/05/16 07:36
转载自:高浩裕的博客
本题地址:>here<
ps:本文原主在cogs上刷题
以下正文
–>此处传送<–
【题目描述】
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
【输入格式】
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
【输出格式】
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
【样例输入】
31 12 37 44 61234531 12 37 44 6
【样例输出】
212
就只是偶然在一张ppt中看到了题解
去试了一下
想应该不会这么难
后来才发现还有高精度
好吧
这就算了
最后一个坑爹的点
让我学会了做人
整道题做了3个小时
太恶心了
做法是贪心
大概就是说
我们是尽可能让大家都拿少一点
而最后一个又是最有可能拿到最多的
所以
设A=a[1]*……*a[n]
最后一个人拿到的就是A/(a[i]*b[i])
i为1~n的其中一个数
意思是在1~n中找到一个人使他成为最后的那个人
那么当a[i]*b[i]最大的时候
这个值会最小
因此排序一下就行了
排除了倒数第一人以后
再来排除倒数第二个,以此类推
我的做法还在最小值最大化的这个值和第一个人所能拿到的钱比较一次
可能只是勉强卡过去了
最不好调试的其实是高精度
这是我第一次在一个程序里集合了三种重载运算符
而重载运算用smartcpp调试功能可以卡死你
所以唯有输出调试
另外高精度如果不学重载真的很难实现
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int _maxn=10100;struct e{ long long a,b,s;}t[_maxn];int n;long long a1,b1;struct d{ int num[10000],l; friend d operator *(d x,int y) { d t; int l1=x.l; for(int i=1;i<=l1;i++) t.num[i]=x.num[i]*y; for(int i=1;i<=l1;i++) { if(t.num[i]>=10) { if(i==l1) l1++; t.num[i+1]+=t.num[i]/10; t.num[i]%=10; } } t.l=l1; return t; } friend d operator /(d x,int y) { d t; int g=0,m[10000],k=-1; for(int i=x.l;i>=1;i--) { g+=x.num[i]; if(g>=y) { m[++k]=g/y; g%=y; } else m[++k]=0; g*=10; } for(int i=k;i>=1;i--) t.num[i]=m[k-i+1]; t.l=k; return t; } friend bool operator >(d x,d y) { if(x.l>y.l) return true; else if(x.l<y.l) return false; else { int l1=x.l; for(int i=l1;i>=1;i--) { if(x.num[i]>y.num[i]) return true; else if(x.num[i]<y.num[i]) return false; } return false; } } void print() { bool flag=true; for(int i=l;i>=1;i--) { if(num[i]==0 && flag) continue; if(flag) flag=false; cout<<num[i]; } cout<<endl; }}A,ans;void read(){ scanf("%d",&n); scanf("%lld%lld",&a1,&b1); A.num[1]=a1; A.l=1; for(int i=1;i<=n;i++) { scanf("%lld%lld",&t[i].a,&t[i].b); t[i].s=t[i].a*t[i].b; A=A*t[i].a; }}bool cmp(e x,e y) { if(x.s!=y.s) return x.s>y.s; return x.a>y.a;}void solve(){ ans.num[1]=0; ans.l=1; sort(t+1,t+n+1,cmp); for(int i=1;i<=n;i++) { if(A/t[i].s>ans) ans=A/t[i].s; A=A/t[i].a; } long long k=a1*t[n].a/t[n].b; long long a11=0; if(ans.l<=18) { for(int i=ans.l;i>=1;i--) { a11*=10; a11+=ans.num[i]; } if(a11>k) cout<<a11<<endl; else cout<<k<<endl; } else ans.print();}int main(){ freopen("kinggame.in","r",stdin); freopen("kinggame.out","w",stdout); read(); solve(); return 0;}
- 洛谷1080 国王游戏
- 洛谷 P1080 国王游戏
- 洛谷 P1080 国王游戏
- 洛谷 P1080 国王游戏
- [洛谷]P1080 国王游戏
- 洛谷 1080 [NOIP2012] 国王游戏 贪心+高精
- 国王游戏
- 国王游戏
- 国王游戏
- 国王游戏
- 洛谷 [NOIP2012 D1T2] P1080 国王游戏
- 【洛谷】P1080国王游戏(高精)
- 洛谷P1080:国王游戏 (贪心+高精度)
- 【NOIP 2012】 国王游戏
- 国王游戏 题解
- VIJOS 1779 国王游戏
- wikioi1198 国王游戏
- vijos P1779 国王游戏
- 【leetcode】338. Counting Bits
- VoLTE——EPC附着
- 蓝缘系统business版本正式上线
- 我的第一篇CSDN博客
- 重要网站收藏
- 洛谷1080 国王游戏
- VoLTE—IMS注册
- Linux下安装nginx
- 阅读<java数据结构和算法>这本书的总结:第一章
- python调试
- VoLTE—IMS呼叫
- Spring 双亲容器
- gdb基本调试命令
- android应用私有存储文件的写入与读取-openFileInput 和 openFileOutput