题解 | 冰冻青蛙
正当我百思不得其解时,一看题解,竟然还没人写???那没办法了,我来写一篇:-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,大家可以多多关注他
