123减法

本文深入探讨了一个数学游戏问题的两种解法:贪心算法与广度优先搜索(BFS)。游戏目标是在不超过100步内,通过减1、减2或减3的操作,使初始数n变为0,同时避免遇到三个禁止数值。文章对比了两种算法的实现过程,展示了贪心算法的高效性和BFS的全面搜索能力。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意:给你三个数nn1n2n3。你可以对n做下面三种操作之一:

  • 将n减1

  • 将n减2

  • 将n减3

最多做100次操作,且n不能等于n1n2n3中的任意一个,问你是否可以将n变成0。

因为这题只有三种转移状态,我第一反应想到的是bfs搜索,很好实现,代码如下:


//https://blog.csdn.net/hesorchen
// #include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <cstring>
using namespace std;
#define ll long long
#define endl "\n"
#define mod 1000000007

int n, n1, n2, n3;
int t[308];
struct node
{
    int zhi, step;
} a, b;
queue<node> q;
int bfs()
{
    a.zhi = n;
    a.step = 0;
    q.push(a);
    while (!q.empty())
    {
        a = q.front();
        q.pop();
        if (a.step > 100 || a.zhi == n1 || a.zhi == n2 || a.zhi == n3||t[a.zhi])
            continue;
    t[a.zhi]=1;
        if (a.zhi == 0 && a.step <= 100)
            return 1;
        if (a.zhi - 1 >= 0)
        {

            b.zhi = a.zhi - 1;
            b.step = a.step + 1;
            q.push(b);
        }
        if (a.zhi - 2 >= 0)
        {
            b.zhi = a.zhi - 2;
            b.step = a.step + 1;
            q.push(b);
        }
        if (a.zhi - 3 >= 0)
        {
            b.zhi = a.zhi - 3;
            b.step = a.step + 1;
            q.push(b);
        }
    }
    return 0;
}
int main()
{
    cin >> n >> n1 >> n2 >> n3;
    if (bfs())
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

赛后有人贴出代码之后发现这其实是贪心+模拟,因为有次数限制,所以每一次都尽量多减一点。

AC代码:

//https://blog.csdn.net/hesorchen
// #include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define ll long long
#define endl "\n"
#define mod 1000000007
int n, a, b, c;
int check(int x)
{
    if (x != a && x != b && x != c)
        return 1;
    return 0;
}
int main()
{
    cin >> n >> a >> b >> c;
    if (!a || !b || !c || !check(n))
        return !printf("NO\n");
    int flag = 1;
    int step = 0;
    while (n > 0)
    {
        step++;
        if (check(n - 3))
            n -= 3;
        else if (check(n - 2))
            n -= 2;
        else if (check(n - 1))
            n -= 1;
        else
        {
            flag = 0;
            break;
        }
    }
    if (flag && step <= 100)
        return !printf("YES\n");
    printf("NO\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值