【正经题解】
2025-07-12 16:09:07
发布于:浙江
31阅读
0回复
0点赞
本题主要考察队列的基本操作。
首先我们先根据题目创建一个队列queue<int> a
,并按题目要求向队列里添加元素,既从1开始依次递增的等差数列:
void slove(int n){
for(int i=1;i<=n;i++){
a.push(i);
}
}
接下来,可以看出我们是不知道一共要报几次数的,所以我们用while循环。条件就是判断该队列是否为空。既while(a.size()!=0)
,并创建一个变量i
用于模拟报数。然后先不要着急,我们先按照题目要求写一个判断函数,我们需要判断当前这个i
是否为5的倍数或其中是否含有5:
bool is_if(int i){
string n=to_string(i);
bool m=false;
for(int i=0;i<=n.size()-1;i++){
if(n[i]=='5'){
m=true;
break;
}
}
return (m or i%5==0);
}
之后我们要模拟一下淘汰出圈的过程,既输出队首元素并出队(注意要带一个空格):
if(is_if(i)){
cout << a.front()<<" ";
a.pop();
}
最后还有一点,就是要模拟依次报数这个过程。就是出队后在入队即可:
else{
a.push(a.front());
a.pop();
}
完整代码(注意模拟报数的i要加一):
#include <bits/stdc++.h>
using namespace std;
queue<int> a;
void slove(int n){
for(int i=1;i<=n;i++){
a.push(i);
}
}
bool is_if(int i){
string n=to_string(i);
bool m=false;
for(int i=0;i<=n.size()-1;i++){
if(n[i]=='5'){
m=true;
break;
}
}
return (m or i%5==0);
}
int main(){
int n;
cin >> n;
slove(n);int i=1;
while(a.size()!=0){
if(is_if(i)){
cout << a.front()<<" ";
a.pop();
}else{
a.push(a.front());
a.pop();
}i++;
}
return 0;
}
时间复杂度:其中是因为每个数至少会被处理n次。而d是指数的位数。
这里空空如也
有帮助,赞一个