国王游戏
题目链接:国王游戏
题目描述
解题思路
我们考虑交换相邻的两个人。
交 换 前 交换前 交换前
当前位置 | 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∗...∗ai−1 |
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∗...∗ai−1∗ai |
最大值 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∗...∗ai−1,bi+1a1∗...∗ai−1∗ai)
交 换 后 交换后 交换后
当前位置 | 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∗...∗ai−1 |
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∗...∗ai−1∗ai+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∗...∗ai−1,bia1∗...∗ai−1∗ai+1)
a 1 ∗ . . . ∗ a i − 1 ∗ a i + 1 b i \frac{a_1*...*a_{i-1}*a_{i+1}}{b{i}} bia1∗...∗ai−1∗ai+1 肯定是大于 a 1 ∗ . . . ∗ a i − 1 b i \frac{a_1*...*a_{i-1}}{b{i}} bia1∗...∗ai−1 的,那么如果 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∗...∗ai−1∗ai<bia1∗...∗ai−1∗ai+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∗...∗ai−1∗ai∗bi<a1∗...∗ai−1∗ai+1∗bi+1
得
a i ∗ b i < a i + 1 ∗ b i + 1 a_i*b_i<a_{i+1}*b_{i+1} ai∗bi<ai+1∗bi+1
那么我们以 a i ∗ b i a_i*b_i ai∗bi 作为关键字排序即可。
记得敲高精。
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];
}