Number Transformation II CodeForces - 347E

题意:求最小步骤从A到B;每一次操作可-1或者a-a%(xi);
贪心,每次都减去最大的;
然后发现暴力肯定会TLE
所以用set存储x数组,直接去重加排序;然后每次操作之后,选择不合法的删去

#include
using namespace std;
#define maxn 111111
set<int> st1,st2;
int main()
{
    int n,a,b,x,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        st1.insert(x);
    }
    scanf("%d%d",&a,&b);
    while(a>b)
    {
        set<int>::iterator it;
        int aa=a-1;
        for(it=st1.begin();it!=st1.end();it++)
            if(a-a%(*it)>=b)
            {
                aa=min(a-a%(*it),aa);
                st2.insert(*it);
            }
        ans++;
        a=aa;
        st1.clear();
        st1=st2;
        st2.clear();
    }
    printf("%d\n",ans);
}

你可能感兴趣的:(cf,STL)