傳送門
題意:
給兩個數字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;
}