杜晨路牛逼


私信TA

用户名:cbjsgmm1108

访问量:1917

签 名:

等  级
排  名 36865
经  验 415
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 浙江科技学院
专  业

  自我简介:

解题思路:

注意事项:

参考代码:

#include<iostream>

#include<algorithm>

using namespace std;

int check(int n,int c,int d)

{

    while(n>0) //不能写成 while(n)(当n<0时也会成立) 

    {

        if(n%c==0||n%d==0)

        return 1;

        if((n-c)%d==0||(n-d)%c==0)

        return 1;

        n-=c+d;

    }

    return 0;

}

int main()

{

    int a,b;

    while(cin>>a>>b)

    {

        int c=min(a,b);

        int d=max(a,b);

        int ok=0,ans=0;

        for(int i=d;;i++) //虽然c和d之间的数目也有买不到的数目,但却不是最大的,故不用考虑

        {

            if(ok==c)

            break;

            // ok表示可以连续买到的数目,c表示两包糖中较少的那包的糖的数目

            // 如果连续 c个糖果数可以买到,那么之后的所有糖果数都可以买到

            // 假设从糖果数i可以买到,且连续 c 个糖果数都可以买到,即i,i+1,i+2,i+3,...,i+c-1,都可以买到

            // 那么糖果数为 i+c 就可以用 糖果数i 加上c 组合成,以此类推,i+c+1=(i+1)+c,... 

            // 因此从糖果数 i及以后的数目都可以买到,故 i-1 买不到的最大数目 

            // 当然这里是有公式的:a,b为两个质数,则不能用a,b表示的最大的数为: a*b-(a+b) 

            if(check(i,c,d))

            {

                if(ok==0)

                {

                    ans=i;

                }

                ok++;

            }

            else

            {

                ok=0;

            }

        } 

        cout<<ans-1<<endl;

    }

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »