NOIP2012国王游戏
2015-09-01 21:13
423 查看
题目描述:
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。输入:
第一行包含一个整数 n,表示大臣的人数。第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。 接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
对于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。
输出:
输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。样例输入:
31 1
2 3
7 4
4 6
样例输出:
2分析:
一道贪心题,将大臣们左手上的数与右手上的数的乘积作为关键字从小到大排序,即是最优方案,再算出该方案的最大值。然而要写高精度……真是恶心,码了一小时终于码了出来……code:
#include<cstdio> #include<cstring> #include<algorithm> #define MAXM 5000 #define MAXN 1000 #define bit 10 using namespace std; inline int max(int a,int b){return a>b?a:b;} struct HP{ int num[MAXM],r,l,sum; HP(){memset(num,0,sizeof num);} void READ(const int n) { int tmp=n; do{ num[++num[0]]=tmp%bit,tmp/=bit; }while(tmp); } void READ(const char *s) { int now=0; num[0]=strlen(s); for(int i=num[0]-1;i>=0;i--) num[++now]=s[i]-'0'; } bool operator >(const HP& b)const { if(num[0]>b.num[0]) return true; if(num[0]<b.num[0]) return false; for(int i=num[0];i>=1;i--) { if(num[i]>b.num[i]) return true; if(num[i]<b.num[i]) return false; } return false; } bool operator <(const HP& b)const { return sum<b.sum; } HP operator *(const HP& b) { HP res; res.num[0]=num[0]+b.num[0]-1; for(int i=1;i<=num[0];i++) for(int j=1;j<=b.num[0];j++) res.num[i+j-1]+=num[i]*b.num[j]; for(int i=1;i<=res.num[0];i++) { res.num[i+1]+=res.num[i]/bit; res.num[i]%=bit; if(i==res.num[0]&&res.num[i+1]) ++res.num[0]; } return res; } HP operator *(const int& b) { HP res,fac; fac.READ(b); res=*this*fac; return res; } void operator *=(const HP& b) { *this=*this*b; } void operator *=(const int& b) { *this=*this*b; } void operator /=(const int& b) { int l=0,bb=b; do{ ++l,bb/=bit; }while(bb); for(int i=num[0];i>1;i--) { num[i-1]+=(num[i]%b)*bit; num[i]/=b; } num[0]=num[0]-l+1; for(num[1]/=b;!num[num[0]]&&num[0]>0;--num[0]); } HP operator /(const int& b) { HP res=*this; res/=b; return res; } void print() { for(int i=num[0];i>=1;i--) printf("%d",num[i]); printf("\n"); } }line[MAXN+5],sum,maxg; int n; int main() { int i; scanf("%d",&n); for(i=0;i<=n;i++) { scanf("%d%d",&line[i].l,&line[i].r); line[i].sum=line[i].l*line[i].r; line[i].READ(line[i].l); } sort(line+1,line+n+1); sum=line[0]; for(i=1;i<=n;i++) { if(sum/line[i].r>maxg) maxg=sum/line[i].r; sum*=line[i]; } maxg.print(); }
相关文章推荐
- createrepo and smart channel
- Oracle数据库修改字段长度
- 采样示波器和实时示波器的原理与各自优势
- C#中的线程(二) 线程同步基础
- 获取硬件因子
- 求递归算法时间复杂度:递归树【待研究】
- C#中的线程(二) 线程同步基础
- 数据结构基础 之 循环链表
- 面试题26:复杂链表复制
- 整数的个数
- 聚簇索引和非聚簇索引
- 《IOS_C语言》函数指针、函数回调、动态排序、函数返回值是函数指针
- 第十三章 时间序列分析和预测
- POJ C++程序设计 编程题#1 编程作业—文件操作与模板
- centos7 设置字体大小
- LEETCODE-Ugly Number
- 聊天界面的制作(一)——基本布局的实现
- 结构体和共用体关于内存的分配问题
- 黑马程序员——Java 网络编程
- 类集相关