记录编号 321686 评测结果 AAAAAAAAAA
题目名称 [NOIP 2012]国王游戏 最终得分 100
用户昵称 Gravatar核糖核酸 是否通过 通过
代码语言 C++ 运行时间 2.184 s
提交时间 2016-10-13 21:06:23 内存使用 1.13 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define N 10005
using namespace std;
struct Node {
	int lf, rf;
} p[N];
int n;
struct Bigint {
	int s[100005], len;
	
	void Init() {
		memset(s, 0, sizeof(s));
		len = -1;
	}
	
	void print() {
		for(int i=len; i>=0; i--) putchar(s[i]+'0');
		puts("");
	}
	
	Bigint operator = (int b) {
		Init();
		if(b == 0) len = 0;
		else while(b) {
			s[++len] = b % 10;
			b /= 10;
		}
		return *this;
	}
	
	Bigint operator = (const Bigint & b) {
		Init();
		len = b.len;
		for(int i=0; i<=len; i++) s[i] = b.s[i];
		return *this;
	}
	
	bool operator == (const Bigint & b) const {
		if(len != b.len) return false;
		for(int i=0; i<=len; i++)
			if(s[i] != b.s[i]) return false;
		return true;
	}
	
	bool operator >= (const Bigint & b) const {
		if(*this == b) return true;
		if(len < b.len) return false;
		if(len > b.len) return true;
		for(int i=len; i>=0; i--) {
			if(s[i] > b.s[i]) return true;
			if(s[i] < b.s[i]) return false;
		}
	}
	
	Bigint operator * (const int & b) const {
		Bigint t; t.Init();
		for(int i=0; i<=len; i++)
			t.s[i] += s[i] * b;
		for(int i=0; i<=(len+50); i++) {
			t.s[i+1] += (t.s[i] / 10);
			t.s[i] %= 10;
		}
		t.len = len + 50;
		while(t.len && t.s[t.len]==0) t.len--;
		return t;
	}
	
	Bigint operator / (const int & b) const {
		Bigint t; t.Init();
		int v = 0;
		for(int i=len; i>=0; i--) {
			v = v * 10 + s[i];
			if(v >= b) {
				t.s[i] = v / b;
				v %= b;
			}
		}
		t.len = len;
		while(t.len && t.s[t.len]==0) t.len--;
		return t;
	}
	
};

Bigint sum, ans;

void Solve() {
	ans = 0;
	sum = p[0].lf;
	for(int i=1; i<=n; i++) {
		Bigint sco;
		sco = sum / p[i].rf;
		if(sco >= ans) ans = sco;
		sum = sum * p[i].lf;
	}
	ans.print();
}

bool cmp(const Node aa, const Node bb) {
	return aa.lf * aa.rf < bb.lf * bb.rf;
}

int main() {
	freopen("kinggame.in", "r", stdin);
	freopen("kinggame.out", "w", stdout);

	scanf("%d", &n);
	for(int i=0; i<=n; i++) scanf("%d%d", &p[i].lf, &p[i].rf);
	sort(p+1, p+n+1, cmp);
	Solve();
	
	return 0;
}