记录编号 124254 评测结果 AAAAAAAAAA
题目名称 [NOIP 2012]国王游戏 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.041 s
提交时间 2014-10-02 20:41:53 内存使用 3.74 MiB
显示代码纯文本
/*
倒不等式 
max{s(i-1) - b(i), s(j-1) - b(j)} >=  max{s(i-1) - b(j), s(j-1) - b(i)}
s2(j-1) = s(j-1) - a(i) + a(j)
1.s(i-1) < s(j-1)
2.b(j) > b(i), s(i-1) - b(j) < s(j-1) - b(j)
所以当 b(i)+a(i) > a(j)+b(j) (i<j时交换)
所以以 b(i)+a(i) 为关键字,从大到小排列,即得出结果排列 
注意是乘法,用高精度。 
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

#define Maxn 1002

using namespace std;

int n;

class int64{ //万进制高精 
public:
	int len,num[1001];
	int64(){
		memset(num,0,sizeof(num));
		len=0;
	}
	bool operator>(const int64 a)const{
		for(int i=len-1;i>=0;i--)
		{
			if(a.num[i]!=num[i])
			return num[i]>a.num[i];
		}
		return false;
	}
	int64 operator*(const int a)const{
		int64 res=*this;
		for(int i=0;i<len;i++) res.num[i]*=a;
		for(int i=0;i<res.len;i++)
		{
			if(res.num[i]>=10000)
			{
				res.num[i+1]+=res.num[i]/10000;
				res.num[i]%=10000;
			}
		}
		if(res.num[res.len]) res.len++;
		return res;
	}
	int64 operator/(const int a)const{
		int64 res=*this;
		int i;
		for(i=res.len-1;i>=0;i--)
		{
			if(i>0)	res.num[i-1]+=(res.num[i]%a)*10000;
			res.num[i]/=a;
		}
		while(res.len>0 && res.num[res.len-1]==0) res.len--;
		if(res.len==0) res.len=1;
		return res;
	}
	void print(){
		printf("%d",num[len-1]);
		for(int j=len-2;j>=0;j--)
			printf("%04d",num[j]);
		printf("\n");
	}
} s[Maxn]; //前缀和

struct number{
	long long x,y; //正如题意所述 A[i]=pow(10,a[i])
	bool operator<(const number a)const{
		return (x+y)<(a.x+a.y);
	}
} V[Maxn]={0};

int64 Max(int64 x,int64 y)
{
	if(x>y) return x;
	return y;
}

void work()
{
	int64 Ans;
	sort(V+2,V+n+2); //从小到大排序
	s[1].num[0]=V[1].x;
	s[1].len=1; //国王设定 
	for(int i=2;i<=n+1;i++) //计算最大 
	{
		s[i]=s[i-1]*V[i].x;
		if((s[i-1]/V[i].y)>Ans)
			Ans=(s[i-1]/V[i].y);
	}
	Ans.print();
}

void init()
{
	int x,y;
	ios::sync_with_stdio(false); //清除缓存 
	cin>>n;
	for(int i=1;i<=n+1;i++) //0为国王,0-1=-1,不用考虑 
	{
		cin>>V[i].x>>V[i].y;
	}
}

int main()
{
	freopen("kinggame.in","r",stdin);
	freopen("kinggame.out","w",stdout);
	init();
	work();
	return 0;
}
/*
3
1 1
2 3
7 4
4 6
*/