【ybt】【基算 贪心 课过 例4】国王游戏

国王游戏

题目链接:国王游戏


题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

我们考虑交换相邻的两个人。
交 换 前 交换前

当前位置 a a a b b b 权值
i i i a i a_{i} ai b i b_{i} bi a 1 ∗ . . . ∗ a i − 1 b i \frac{a_1*...*a_{i-1}}{b{i}} bia1...ai1
i + 1 i+1 i+1 a i + 1 a_{i+1} ai+1 b i + 1 b_{i+1} bi+1 a 1 ∗ . . . ∗ a i − 1 ∗ a i b i + 1 \frac{a_1*...*a_{i-1}*a_i}{b{i+1}} bi+1a1...ai1ai

最大值 a n s 1 ans1 ans1 max ⁡ ( a 1 ∗ . . . ∗ a i − 1 b i , a 1 ∗ . . . ∗ a i − 1 ∗ a i b i + 1 ) \max(\frac{a_1*...*a_{i-1}}{b{i}},\frac{a_1*...*a_{i-1}*a_i}{b{i+1}}) max(bia1...ai1,bi+1a1...ai1ai)
交 换 后 交换后

当前位置 a a a b b b 权值
i + 1 i+1 i+1 a i + 1 a_{i+1} ai+1 b i + 1 b_{i+1} bi+1 a 1 ∗ . . . ∗ a i − 1 b i + 1 \frac{a_1*...*a_{i-1}}{b{i+1}} bi+1a1...ai1
i i i a i a_{i} ai b i b_{i} bi a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 b i \frac{a_1*...*a_{i-1}*a_{i+1}}{b{i}} bia1...ai1ai+1

最大值 a n s 2 ans2 ans2 max ⁡ ( a 1 ∗ . . . ∗ a i − 1 b i + 1 , a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 b i ) \max(\frac{a_1*...*a_{i-1}}{b{i+1}},\frac{a_1*...*a_{i-1}*a_{i+1}}{b{i}}) max(bi+1a1...ai1,bia1...ai1ai+1)

a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 b i \frac{a_1*...*a_{i-1}*a_{i+1}}{b{i}} bia1...ai1ai+1 肯定是大于 a 1 ∗ . . . ∗ a i − 1 b i \frac{a_1*...*a_{i-1}}{b{i}} bia1...ai1 的,那么如果 a n s 1 < a n s 2 ans1<ans2 ans1<ans2 ,则说明 a 1 ∗ . . . ∗ a i − 1 ∗ a i b i + 1 < a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 b i \frac{a_1*...*a_{i-1}*a_i}{b{i+1}}<\frac{a_1*...*a_{i-1}*a_{i+1}}{b{i}} bi+1a1...ai1ai<bia1...ai1ai+1

我们将其化简:
a 1 ∗ . . . ∗ a i − 1 ∗ a i ∗ b i < a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 ∗ b i + 1 a1*...*a_{i-1}*a_i*b_{i}<a_1*...*a_{i-1}*a_{i+1}*b_{i+1} a1...ai1aibi<a1...ai1ai+1bi+1

a i ∗ b i < a i + 1 ∗ b i + 1 a_i*b_i<a_{i+1}*b_{i+1} aibi<ai+1bi+1
那么我们以 a i ∗ b i a_i*b_i aibi 作为关键字排序即可。
记得敲高精。

code

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;

int n;
int l,r;
int ans[100000],tota;
int t[100000],tott;

struct abc{
    
    
	int x,y;
}a[1010];

bool cmp(abc a,abc b)
{
    
    
	return a.x*a.y<b.x*b.y;
}

void emmm(int k)
{
    
    
	int tt[100000]={
    
    },s=0,tottt=0;
	for(int i=tott;i>=1;i--)
	{
    
    
		s=s*10+t[i];
		while(s>=a[k].y)
			tt[i]++,s-=a[k].y;
		if(tt[i]&&!tottt)
			tottt=i;
	}
	if(tottt>=tota)
	{
    
    
		int flag=0;
		if(tottt>tota)
			flag=1;
		else for(int i=tottt;i>=1;i--)
		{
    
    
			if(tt[i]>ans[i])
			{
    
    
				flag=1;
				break;
			}
			if(tt[i]<ans[i])
			{
    
    
				flag=-1;
				break;
			}
		}
		if(flag)
		{
    
    
			for(int i=1;i<=tottt;i++)
				ans[i]=tt[i];
			tota=tottt;
		}
	}
	s=0;
	int j=tott+5;
	for(int i=1;i<=j;i++)
	{
    
    
		s=t[i]*a[k].x+s;
		t[i]=s%10;
		s/=10;
		if(t[i])
			tott=i;
	}
}

signed main()
{
    
    
	cin>>n;
	cin>>l>>r;
	for(int i=1;i<=n;i++)
		scanf("%lld%lld",&a[i].x,&a[i].y);
	sort(a+1,a+n+1,cmp);
	while(l)
	{
    
    
		t[++tott]=l%10;
		l/=10;
	}
	for(int i=1;i<=n;i++)
		emmm(i);
	for(int i=tota;i>=1;i--)
		cout<<ans[i];
}

猜你喜欢

转载自blog.csdn.net/SSL_guyixin/article/details/111718929