国王游戏

国王真会玩

\[king~~l_0~~r_0\\ 1~~l_1~~r_1\\ 2~~l_2~~r_2\\ l_1:l_0/r1或者(l_0*l_2)/r1\\ l_2:(l_0*l_1)/r_2或者l_0/r_2\\ ans = max(\frac{l_0}{r_1},\frac{l_0*l_1}{r_2})或max(\frac{l_0*l_2}{r_1},\frac{l_0}{r_2})\\ 显然l_0*l_2\ge l_0\\ 如果ans1>ans2~~\frac{l_0*l_1}{r_2}>\frac{l_0*l_2}{r_1}\\ l_1*r_1>l_2*r_2 \]

按此排序即可,giao精

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxe 10001
using namespace std;
int n,lens = 1,lenm = 1,lena = 1;
int sum[maxe] = {0,1},maxn[maxe] = {0,1},ans[maxe];
struct tmp{
	int l,r;
	bool operator < (const tmp x){//
	return l * r < x.l * x.r;
	}
}coin[maxe];
inline void muti(int x){
	int tmp = 0;
	for(int i = 1; i <= lens; i++) sum[i] *= x;
	for(int i = 1; i <= lens; i++){
		tmp += sum[i];
		sum[i] = tmp %10;
		tmp /= 10;
	}
	while(tmp != 0){
		lens++;
		sum[lens] = tmp % 10;
		tmp /= 10;
	}
}
void cut(long long x)
{
	memset(ans, 0, sizeof(ans));
	lena = lens;
	int tmp = 0;
	for(int i = lena; i >= 1; i--)
	{
		tmp *= 10;
		tmp += sum[i];
		if(tmp >= x){
			ans[i] = tmp / x;
			tmp %= x;
		}
	}
	while(ans[lena] == 0){
		if(lena == 1)
			break;
		lena--;
	}
}
void max(){
	if(lena > lenm){
		for(int i = 1; i <= lena; i++)
			maxn[i] = ans[i];
		lenm = lena;
	}
	else if(lena == lenm){
		for(int i = lena; i >= 1; i--)
			if(maxn[i] < ans[i]){
				for(int j = 1; j <= lena; j++)
					maxn[j] = ans[j];
				lenm = lena;
				break;
			}
	}
}

int main(){
	cin >> n;
	cin >> coin[0].l >> coin[0].r;
	for(int i = 1; i <= n; i++)
		scanf("%d %d", &coin[i].l, & coin[i].r);
	sort(coin + 1, coin + n + 1);
	for(int i = 1; i <= n; i++)
	{
		muti(coin[i - 1].l);
		cut(coin[i].r);
		max();
	}
	for(int i = lenm; i >= 1; i--)
		cout << maxn[i];
}
posted @ 2020-08-09 09:29  INFP  阅读(99)  评论(0编辑  收藏  举报