解题思路:暴力枚举,但是思路是取模的思路。
因为是两个数,如果能买的到的话,那么一定是由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 人评分
钟神赛车 (C语言代码)浏览:911 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:701 |
简单的a+b (C语言代码)浏览:594 |
printf基础练习2 (C语言代码)浏览:605 |
【出圈】 (C语言代码)浏览:824 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
A+B for Input-Output Practice (C语言代码)浏览:505 |
有关字符,字符串的输入输出函数说明浏览:498 |
杨辉三角 (C语言代码)浏览:505 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:525 |