[贪心]D. 【例题4】国王游戏

D . 【 例 题 4 】 国 王 游 戏 D. 【例题4】国王游戏 D.4


[贪心]D. 【例题4】国王游戏_第1张图片
[贪心]D. 【例题4】国王游戏_第2张图片

解析

贪心思想,考虑交换后的值比交换前的小.
然后数据规模用高精度


Code

#include  
using namespace std;

int n, et[10005], ans[10005], ex[10005], aer,aet,ert;
struct node
{
     
	int l, r, lr;
}a[10005];
bool cmp(node x,node y)
{
     
	return x.lr < y.lr ? 1 : 0;
}
void qer(int x)
{
     
	for (int i = 1; i <= aet; ++ i) et[i] *= x;
	for (int i = 1; i <= aet; ++ i)
	{
     
		et[i + 1] += et[i] / 10;
		et[i] %= 10;
		if (i == aet && et[i + 1] != 0) ++ aet;
	}
}
void tue(int x)
{
     
	memset (ex, 0, sizeof (ex));
	ert = 0;
	int val = 0;
	for (int i = aet; i > 0; -- i)
	{
     
		val = val * 10 + et[i];
		ex[i] = val / x;
		if (ert == 0 && ex[i] != 0) ert = i;
		val%=x;
	}
	for (int i = 1; i <= ert; ++ i)
	{
     
		ex[i + 1] += ex[i] / 10;
		ex[i] %= 10;
		if (i == ert && ex[i + 1] != 0) ++ ert;
	}
}
bool check()
{
     
	if (aer < ert) return 1;
	if (ert < aer) return 0;
	for (int i = aer; i > 0; -- i)
	{
     
		if (ex[i] > ans[i]) return 1;
		if (ex[i] < ans[i]) return 0;
	} 
	return 0;
}
void swp()
{
     
	for (int i = 1; i <= ert; ++ i) ans[i] = ex[i];
	aer = ert;
}
int main()
{
     
	scanf("%d",&n);
	aet = et[1] = 1;
	for (int i = 0; i <= n; ++ i)
	{
     
		scanf ("%d%d", &a[i].l, &a[i].r);
		a[i].lr = a[i].l * a[i].r;
	}
	sort (a + 1, a + n + 1, cmp);
	for (int i = 1; i <= n; ++ i)
	{
     
		qer (a[i - 1].l);
		tue (a[i].r);
		if (check ()) swp ();
	}
	for (int i = aer; i > 0; -- i) printf ("%d", ans[i]);
	return 0;
}  

你可能感兴趣的:(贪心)