题解 | 冰冻青蛙

正当我百思不得其解时,一看题解,竟然还没人写???那没办法了,我来写一篇:-D

思路及对题目的理解

一只能被冰冻的青蛙可以把相邻的两个冻住,那么根据贪心(的思想),肯定是要冻住两只不能冻住别的青蛙的青蛙

那么我们首先得判断这种能冰冻别的青蛙的青蛙的数量是否够,不够的话就Baka了()

够了的话,就用就用队列进行输出就好了

小技巧:

gcd在vsc上和牛客上已经内置了,所以可以直接用

但是有时候并不会内置(所以还是建议大家写一下)

一个认为比较好的方法:

int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}

有一个我自创的记忆方法:“babab”法,因为大括号里的b和a的出现顺序满足babab的顺序,只要你会三元运算符,并且能记住前面是==0,后面是gcd(b,a%b)就好啦

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 999999999;
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}
signed main()
{
    int n;
    cin >> n;
    queue<int> froze;
    queue<int> other;
    for (int i = 1; i <= n; i++)//检测哪些是可以冰冻别的青蛙的青蛙
    {
        if (gcd(i, N) != 1)
        {
            froze.push(i);
        }
        else
        {
            other.push(i);
        }
    }
    if (froze.size()*3 < n)//检测冰冻别的青蛙的青蛙的数量是否足够
    {
        cout << "Baka!" << endl;
        return 0;
    }
    else
    {
        while (!other.empty() || !froze.empty())
        {//此处一次while循环输出3个数,分别是被冰冻的,冰冻别人的,和被冰冻的
            if (!other.empty())
            {
                cout << other.front() << ' ';
                other.pop();
            }
            if(!froze.empty())
            {
                cout<<froze.front()<<' ';
                froze.pop();
            }
            if (!other.empty())
            {
                cout << other.front() << ' ';
                other.pop();
            }
        }
    }
    return 0;
}

以上代码包含了轮滑鞋大帝的思路@Lambda_L,大家可以多多关注他

全部评论
接好运
点赞 回复 分享
发布于 今天 20:55 山东

相关推荐

12-04 15:36
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务