1205. 买不到的数目(第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组)

文章通过一个C++程序展示了暴力搜索算法在解决特定问题中的应用,即寻找特定条件下不存在的数。通过递归函数dfs进行搜索,并通过打表找到数值之间的规律。总结出的公式为res=(n-1)*(m-1)-1,其中n和m是输入参数。

暴力搜索,打表找规律。

#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

bool dfs(int m,int p,int q){
    if(m==0)return true;//找到的叶子节点完全由规定的两个数构成
    if(m>=p&&dfs(m-p,p,q))return true;//基本思想:先比较大小,然后不断减去该子树结点值之后查找是否存在叶子结点的值为找的那两个数一个
    if(m>=q&&dfs(m-q,p,q))return true;
    return false;//就是一颗递归搜索树
}


int main()
{
    int n,m,res=0;
    cin>>n>>m;
    for (int i = 1; i <= 1000; i ++ ){
        if(!dfs(i,n,m)){//递归树里找不到这个数
        res=i;

        }
    }
    cout<<res<<endl;
    return 0;
}

根据这个暴力搜索我们可以打表找规律,如下:

3 2 1
3 4 5
3 5 7
3 7 11
3 8 13

大致可以发现规律为n=3时,m+1,res+2

故res=2m+x

代入数据得x=-3

推得公式为res=2m-3;(n=3)

同理,多推几个公式

4 7 17
4 9 23
4 11 29

res=3m-4(n=4)

最后整理得到大致公式res=(n-1)*(m-1)-1.

#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main()
{
    int n,m,res=0;
    cin>>n>>m;
    cout<<(n-1)*(m-1)-1<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值