Codeforces Round #201 (Div. 2) E - Number Transformation II

来源:互联网 发布:mac装双系统win10 编辑:程序博客网 时间:2024/05/29 16:31

题意:给你一个数组xi和两个数a和b,求通过两个途径由a到b的最小次数,1.当前的a减去1,2.当前的a减去a%xi。

思路:首先考虑xi有重复元素,所以去重,然后当a-a%x[i]小于b时那么无论怎么变化a-a%x[i]也必定小于b,所以x的个数是逐渐变少的,那么知道这两个之后用贪心的方法找是1途径还是2,最后直到a==b。

代码如下:

#include<iostream>#include<algorithm>#include<string.h>#include<cstdio>using namespace std;typedef long long LL;#define INF 0x3f3f3f3fint x[100005];int main(){  int n;LL a,b;  scanf("%d",&n);  for(int i=0;i<n;i++)  {    scanf("%lld",&x[i]);  }  int sum=0;  scanf("%lld%lld",&a,&b);  if(a==b)  {    printf("0\n");return 0;  }  sort(x,x+n);  int len=unique(x,x+n)-x;  while(a>b)  {    if(a-1==b)    {      sum++;break;    }    LL ans=-1;    for(int i=0;i<len;i++)    {      if(a-(a%x[i])>=b)      {        if(ans<(a%x[i]))        {          ans=a%x[i];        }      }      else      {        x[i--]=x[--len];      }    }    if((a-1)<=(a-ans))    {      sum++;a-=1;    }    else    {      sum++;a-=ans;    }    //printf("#%lld %lld ",a,ans);    if(a==b) break;  }  printf("%d\n",sum);}


0 0
原创粉丝点击