洛谷1080 NOIP2012 国王游戏

一道贪心+高精度的题目

可是我还做了这么久

注意的是每次都要判断一下

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read(){
	int x=0,f=1,ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
struct BigInt{
	int a[5005];
	int len;
	void init(){
		memset(a,0,sizeof(a));len=0;
	}
	int& operator [](int x){
		return a[x];
	}
	BigInt operator * (const int b)const{
		BigInt c;c.init();c.len=len;
		for(int i=0;i<len;i++) c[i]=a[i]*b;
		for(int i=0;i<len;i++){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
		while(c[c.len]) c[c.len+1]+=c[c.len]/10,c[c.len]%=10,c.len++;
		return c;
	}
	BigInt operator / (const int b)const{
		BigInt c;c.init();c.len=len;
		int ex=0;
		for(int i=len-1;i>=0;i--){
			ex=ex*10+a[i];
			// cout<<ex<<"\t"<<b<<endl;
			c[i]=ex/b;
			ex%=b;
		}
		while(!c[c.len-1]&&c.len>1) c.len--;
		return c;
	}
	void print(){
		for(int i=len-1;i>=0;i--) printf("%d",a[i]);
		puts("");
	}
}one,ans;
inline BigInt max(BigInt a,BigInt b){
	if(a.len<b.len) return b;
	if(a.len>b.len) return a;
	for(int i=a.len-1;i>=0;i--){
		if(a[i]>b[i]) return a;
		if(a[i]<b[i]) return b;
	}
	return a;
}
int a[1001],b[1001],id[1001];
inline bool cmp(int x,int y){
	return a[x]*b[x]<a[y]*b[y];
}
int main(){
	int n=read();a[0]=read();b[0]=read();
	for(int i=1;i<=n;i++) a[i]=read(),b[i]=read(),id[i]=i;
	sort(id+1,id+1+n,cmp);
	one[0]=1;one.len=1;
	// cout<<b[id[1]]<<endl;
	one=one*a[0];ans=one/b[id[1]];
	for(int i=1;i<=n;i++){
		ans=max(ans,one/b[id[i]]);
		// ans.print();
		one=one*a[id[i]];
	}
	ans.print();
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/gcyyzf/p/9692379.html