传送门
题意:
给两个数字a,b,有两个操作,第一个操作直接-1,第二个操作是,求a变成b的最少操作数
题解:
很明显令表示由b+k到b的最少操作数,假设b,b+k可以一步操作到达,
由此得出单调上升,即可贪心每次减去最大值
注意:到会有重复,需要用到函数
去重后的数字
当然也有别的思路:考虑到这是第一步可达区间,再从这里可以依次扩展到其他步的可达区间,有机会再写吧
代码:
#include"algorithm"
#include"iostream"
#include"string.h"
#include"stdio.h"
#define ll long long
using namespace std;
const int Maxn=100005;
ll x[Maxn];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
// freopen("text.in","r",stdin);
int n,ans=0;
ll a,b;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&x[i]);
scanf("%lld%lld",&a,&b);
sort(x+1,x+n+1,cmp);
int len=unique(x+1,x+n+1)-(x+1);
while(a>b)
{
ll t=a;
for(int i=1;i<=len;i++)
{
if(a-a%x[i]<b)x[i--]=x[len--];
else t=min(t,a-a%x[i]);
}
a=min(t,a-1),ans++;
}
printf("%d",ans);
return 0;
}