第一周算法设计与分析 G : 排队援救

简介: 这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。

G : 排队援救

Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 69 Solved: 22

Description

突发重大灾难,n个人陷入困境,有一个救援点需要人们排队准备接受救援,假设每个人有一个名望值,进队规则如下:
第一个人直接进队;
当队里已经有人时,新来的人发现队尾的人的名望值比自己大或者相等,他会选择离开去其他救援点;
队伍最多5人,如果一个人要进队时,发现队伍已满,而且他的名望值比队尾的人大,他会选择把队首的人挤掉而继续排在队尾。
问最后得到救援的人分别是谁。

Input 单组数据。

第一行为n(1 ≤ n ≤ 100),n为正整数。

第二行为n个人的名望值,第i个去排队的人的名望值为ai (1 ≤ ai≤ 232 - 1),且为正整数。

Output

按顺序输出最后得到救援的人的号码,一个人号码是多少即为他是第几个去排队的。

Sample Input

6
1 3 5 7 9 11

Sample Output

2 3 4 5 6

Hint

一、题目大意

设计一个队列模仿,进队,出队,获取当前队列的队尾数值,获取队列的大小,判断队列是否为空。

二、思路

1、储备知识

队列原则:先入先出

a.队列相关的五个函数
函数 功能 例子
push() 入队 queue< int> qu;qu.push(5),qu.push(2),qu.push(0);。则队列里面就有三个数: 5 ,2,0
pop() 出队 qu.pop()后,则现在队列只剩2,0
back() 返回队尾值 此时:qu.back()=0
size() 返回队列长度 此时:qu.size()=2
empty() 判断队列是否为空 此时:qu.empty()=0,表示队列不为空,这一般用于循环取出队列值

注1:头文件:#include
注2:出队的时候需要保证队列不为空
注3:队列实际是一个模板类,初始化的时候需要指定类型,可以是基础类型也可以是自定义类型。如上文中的:queuequ;

b.映射map相关功能的实现

map
映射相当于f(key)->value,类似一个函数

功能 例子
初始化 mapma;//建立了一个int到int的映射
增/改 直接当做左值即可,ma[3]=2,默认ma[3]=0
ma[3]=0
ma[3],对ma[3]进行操作就行了

注1:头文件#include
注2:初始化后,如果value为整数,默认value为0

2、思路

每输入一个声望进行判断
第一步:为每个声望值所代表的人进行编号
第二步:如果队列为空,或者新输入的值大于队尾,则插入
第三步:如果队列大小超过5人则执行出队操作

循环结束后,在对取出队列中的数,对每个数查找对应编号即可

#include<iostream>
#include<map>
#include<queue>
using namespace std;
int main()
{
    map<int,int>ma;
    queue<int>qu;
    int n,num;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>num;
        if(!ma[num])ma[num]=i;                         //如果之前没有记录过,就记录声望值num是第几个排队的人
        if(qu.empty()||num>qu.back()) qu.push(num);    //如果队列是空的或者队尾的数字比num小,就进队
        if(qu.size()>5)qu.pop();                       //如果救援队列大于五就弹出
    }
    while(!qu.empty())
    {
        cout<<ma[qu.front()]<<" ";
        qu.pop();
    }
    return 0;
}
相关文章
|
22天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
46 4
|
3月前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
5天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
11天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
20 0
|
17天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
23 0
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
49 4
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
31 1
|
2月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
3月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
25天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
29 0