yuezi2048


私信TA

用户名:uq_49495570949

访问量:545

签 名:

等  级
排  名 30800
经  验 496
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:暴力枚举,但是思路是取模的思路。

因为是两个数,如果能买的到的话,那么一定是由x袋和y袋组合而成的,那么,我减去y袋以后,他就一定能被x整除。

基于这个思路,我就从头到尾暴力枚举,用一个last_NO_num记录一个最后买不到的数。用于最后输出即可。


注意事项:

做此题的时候是让他一直减,减到等于0(买的到)或者小于0(买不到)为止,但后来超时了。

后来想把暴力的范围缩小,但是这个是杯水车薪。我用了两个递归,分别减x,又减y。

后来突然想到,此组合不需要分顺序,那么只要把其中的一个一直减下去,以减y为例,那么在减去的过程中若能被x整除,那么就是能买到的。


后来看到别人的10行代码,属实佩服,原来还有更方便的方法,他直接通过两个数把对应的关系表弄出来了,

然后还有个牛人推导出公式来的,真的厉害。。

但是我这个取余的方法貌似没找到...也许会有漏洞,他们说出题人少考虑了偶数的情况,嗯...管他呢,AC就ws了


主要是思路逐层优化....

我这里的vis数组就是记录能买的东西的数量,后面如果递归访问到此数的话直接输出true就行了,这样算是一种优化。

额,有点动态规划的意思了。读者意下如何呢..呵呵


参考代码:


 #include<iostream>
 #include<stdio.h>
 #define MAX 100005
 using namespace std;
 typedef long long int ll;
 
 bool vis[MAX]={0};
 
 bool fun(int a,int b,int s)
 {
    if(s%b==0&&s>=0){
        return true;
    }
    if(s<0) return false;
    while(true)
    {
        bool flag1=fun(a,b,s-a);
        if(flag1==true) return true;
        else return false;
    }
 }
 
 int gcd(int a,int b)
 {
     if(a%b==0) return b;
     else return gcd(b,a%b);
 }
 
 int gbs(int a,int b)
 {
     return a*b/gcd(a,b);
 }
 
 int main()
 {
     int a,b;
     cin>>a>>b;
     int last_NO_num=0;
     for(ll i=min(a,b)+1;i<=gbs(a,b);i++)
     {
         if(i%a==0||i%b==0)
         {
             vis[i]=1;
             continue;
         }
        bool flag=fun(a,b,i);
        if(!flag){
            last_NO_num=i;
        }
        else{
            vis[i]=1;
        }
     }
     
     cout<<last_NO_num;
    return 0;
 }

 

0.0分

1 人评分

  评论区

  • «
  • »