noip 2012 国王游戏

如果说这道题作为一道贪心的话其实并不难,但是高精确实烦人(像我这种蒟蒻,看了模板也得想好久)

其实这里只用到了高精乘低精,高精除以低精,要是高精除以高精就完蛋惹;

主要是想学习一下高精而已,加油吧! 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
struct hyq{
	int l,r;
}c[1010];
int res[51000];
char a1[30010];
int ans[30010],anss[30010],ansss[30010];
int b1,sl,maxx,ll;
int maxn[10010]; 
bool cmp(hyq a,hyq b){
	return a.l*a.r<b.l*b.r;
}
void mul(int x){
        for(int i=1;i<=sl;i++){
        	res[i]*=x;
        	
		}
		for(int i=1;i<=sl;i++){
		    res[i+1]+=res[i]/10;
		    res[i]%=10;
		}
		sl++;
		while(res[sl]>9){
			res[sl+1]+=res[sl]/10;
			res[sl]=res[sl]%10;
			sl++;
		}
		while(res[sl]==0&&sl>1) sl--;		
}
void chu(int ss){
	memset(anss,0,sizeof(anss));
	memset(ansss,0,sizeof(ansss));
	memset(ans,0,sizeof(ans));
	ll=sl;
	for(int i=1;i<=ll;i++) anss[ll-i+1]=res[i];
	long long sx=0;
	for(int i=1;i<=ll;i++){
		ansss[i]=(sx*10+anss[i])/ss;
		sx=(sx*10+anss[i])%ss;
	}
	for(int i=1;i<=ll;i++){
		ans[i]=ansss[ll-i+1];
	}
	while(ans[ll]==0&&ll>1){
		ll--;
	}
}
void max(){
	if(ll>maxx){
		maxx=ll;
		for(int i=ll;i>=1;i--){
			maxn[i]=ans[i];
		}
	}
	else if(ll==maxx){
		for(int i=ll;i>=1;i--){
			if(ans[i]>maxn[i]){
				maxx=ll;
				for(int j=i;j>=1;j--){
					maxn[j]=ans[j];
				}
				break;
			}
			if(ans[i]<maxn[i]) break;
		}
	}
}
int main(){
	int n;
	cin>>n;
	cin>>a1;
	cin>>b1;
	sl=strlen(a1);
	for(int i=0;i<sl;i++) res[sl-i]=a1[i]-'0';
	for(int i=1;i<=n;i++){
		cin>>c[i].l>>c[i].r;
	}
	sort(c+1,c+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(i!=1) mul(c[i-1].l);
		chu(c[i].r);
		max();
	}
	for(int i=maxx;i>=1;i--) cout<<maxn[i];
}

猜你喜欢

转载自blog.csdn.net/weixin_42759194/article/details/81630067