算法与数据结构实验题 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;
}

思路
优雅的算法固然美丽,但极致的暴力实在令人着迷
没什么好说的,依题意模拟即可,这里展示的为离线算法

posted @ 2024-11-25 21:30  Severj  阅读(204)  评论(0)    收藏  举报