算法与数据结构实验题 2.11 排队
实验任务
某天,nk 正在和基友 5 排,马上就要晋级了,突然,卡住了,他才发现断网了,他很难过,于是他决定去营业厅问问为什么这几天锐捷一直断网,他到了营业厅才发现,营业厅门口已经排起了长队,由于人数实在太多,营业厅无法解决所有人的问题,他们决定先给所有人编号,第一个人是 2 号,第二个人是 3 号,以此类推;然后帮第一个人(2 号)解决问题,而他后面每隔两个人(4 号,6号,8 号…)都不能接受服务了,再然后帮 3 号服务,其后每隔三个人(9 号,15 号,21 号…)就都无法接受服务,然后帮 5 号服务,其后的每隔 5 个人都无法接受服务,然后帮 7 号服务,其后每隔7 个人都无法接受服务,营业厅最多只愿意服务n 个人,求第 n 个人的编号(ps.无法接受服务的人将伤心地离开队伍,不再进行排队)。
数据输入
每个测试数据是一个正整数 n。(1<=n<=1000,答案最大编号不超过 10000)
数据输出
输出第 n 个接受服务的人的编号。
输入示例
20
输出示例
83
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2e9+1;
int T=1,n;
list<int>a;
int main()
{
//scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=2;i<=10010;i++) a.push_back(i);
for(int i=2;i<=n;i++) {
int cnt=0,num=*a.begin();
for(auto it=a.begin();it!=a.end();++it,++cnt) {
if(cnt%num==0) {
auto temp=it; ++it; ++cnt;
a.erase(temp);
}
if(it==a.end()) break;
}
}
printf("%d",*a.begin());
}
return 0;
}
思路
优雅的算法固然美丽,但极致的暴力实在令人着迷
没什么好说的,依题意模拟即可,这里展示的为离线算法