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;
}
posted @ 2022-11-12 10:52  robinyqc  阅读(29)  评论(0)    收藏  举报