LuoguP1080 [NOIP2012 提高组] 国王游戏
话说没人写 vector 高精的吗?
这道题的思路在《算法竞赛进阶指南》中已经指出。具体如下:

这个方法很好,但实际上这道题还需要更深一步的解决:高精度。需要用到如下函数:乘、除、比较大小。使用面向对象编程以减少码量。具体代码如下;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
struct num{
vector<int>bit;
num(int source){//构造函数,代入零则清零
if(source==0) bit.clear();
while(source){//写不写 else 无所谓
bit.push_back(source%10);
source/=10;
}//这就是最佳顺序了,不需要反转
}
void delete_0(){ //删除前导 0
while(bit.size()>1&&bit.back()==0)
bit.pop_back();
}
num mul(int tar){//大整数乘以小整数
num ans(0);
int ls=bit.size(),carry=0;
for(int i=0;i<ls||carry;i++){
if(i<ls)carry+=bit[i]*tar;
ans.bit.push_back(carry%10);
carry/=10;
} ans.delete_0();
return ans;
}
num dv(int tar){//大整数除以小整数
num ans(0);
int ls=bit.size()-1,remain=0;
for(int i=ls;i>=0;i--){
remain=remain*10+bit[i];
ans.bit.push_back(remain/tar);
remain%=tar;
} reverse(ans.bit.begin(),ans.bit.end());
ans.delete_0();
return ans;
}
void print(){//输出
for(int i=bit.size()-1;i>=0;i--)
putchar(bit[i]+'0');
putchar('\n');
}
};
num Max(num a,num b){//比较大小,返回较大值
if(a.bit.size()!=b.bit.size())
return a.bit.size()<b.bit.size()?b:a;
else for(int i=a.bit.size()-1;i>=0;i--){
if(a.bit[i]!=b.bit[i])
return a.bit[i]<b.bit[i]?b:a;
}return a;
}
struct person{
int a,b;
long long c;
}p[1005];
int n;
bool cmpp(person a,person b){return a.c<b.c;}
signed main(){
scanf("%d",&n);
for(int i=0;i<=n;i++){
scanf("%d%d",&p[i].a,&p[i].b);
p[i].c=1ll*p[i].a*p[i].b;
} stable_sort(p+1,p+1+n,cmpp);
num prd(p[0].a),ans(0);
for(int i=1;i<=n;i++){
ans=Max(ans,prd.dv(p[i].b));
prd=prd.mul(p[i].a);
} ans.print();
return 0;
}

浙公网安备 33010602011771号