首页 > 其他分享 >1284 海港 队列 模拟

1284 海港 队列 模拟

时间:2024-09-30 18:01:50浏览次数:1  
标签:1284 队列 乘客 海港 int ans 国籍 数量

思路解释

 1. 数据结构选择:  
  • 使用 queue 来存储每艘船的到达时间和乘客国籍信息。
 
  • 使用数组 a 来记录每个国籍的乘客数量。
  2. 输入处理:  
  • 读取船只数量 n。
 
  • 对于每艘船,读取其到达时间 t 和乘客数量 k,然后读取每个乘客的国籍 x。
  3. 统计不同国籍的乘客数量:  
  • 如果某个国籍的乘客数量为0,表示这是一个新国籍,增加不同国籍计数 ans。
 
  • 将当前乘客信息加入队列 q。
  4. 移除超过24小时的船只:  
  • 检查队列中的船只,如果其到达时间超过当前时间 t 的24小时(86400秒),则从队列中移除,并更新国籍乘客数量。
 5. 输出结果:  
  • 对于每艘船,输出当前时间点的不同国籍乘客数量 ans。
  通过这种方法,可以高效地统计每艘船到达时的24小时内不同国籍的乘客数量。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5+10;

struct node {
    int t, x;
};

queue<node> q; // 用于存储船只到达时间和乘客国籍的队列
int a[N]; // 用于记录每个国籍的乘客数量
int n, k, x, t, ans; // n: 船只数量, k: 当前船的乘客数量, x: 乘客国籍, t: 当前时间, ans: 不同国籍的乘客数量
node r; // 临时变量,用于存储当前处理的船只信息

int main() {
    scanf("%d", &n); // 读取船只数量
    for (int i = 1; i <= n; i++) {
        scanf("%d %d", &r.t, &k); // 读取当前船只到达时间和乘客数量
        t = r.t; // 更新当前时间
        for (int j = 1; j <= k; j++) {
            scanf("%d", &r.x); // 读取每个乘客的国籍
            if (!a[r.x]) ans++; // 如果该国籍的乘客数量为0,表示是新国籍,增加不同国籍计数
            a[r.x]++; // 增加该国籍的乘客数量
            q.push(r); // 将当前乘客信息加入队列
        }
        r = q.front(); // 获取队列中的第一个元素
        // 移除超过24小时(86400秒)前到达的船只的乘客
        while (!q.empty() && t - r.t >= 86400) {
            q.pop(); // 移除队列中的第一个元素
            a[r.x]--; // 减少该国籍的乘客数量
            if (!a[r.x]) ans--; // 如果该国籍的乘客数量为0,减少不同国籍计数
            if (!q.empty()) r = q.front(); // 更新队列中的第一个元素
        }
        cout << ans << endl; // 输出当前时间点的不同国籍乘客数量
    }
    return 0;
}

 

标签:1284,队列,乘客,海港,int,ans,国籍,数量
From: https://www.cnblogs.com/jyssh/p/18442290

相关文章

  • 9073 关系网络 广搜 队列
    解决思路 广度优先搜索 (BFS):使用BFS从起点 x 开始搜索,找到到达终点 y 的最短路径。 队列:使用队列存储当前节点和步数。 访问标记:使用数组 vis 标记节点是否被访问过,防止重复访问。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;c......
  • 2520 牛的舞蹈表演 二分答案 优先队列
    解决思路 二分查找:使用二分查找来确定舞台的最小大小 K。 检查函数:定义一个检查函数 check(mid),判断在舞台大小为 mid 时,演出是否能在 T_max 时间内完成。 优先队列:使用优先队列模拟舞台上的奶牛,确保每次有奶牛完成表演时,下一头奶牛立即上台。 更新边界:......
  • 9564 Work Scheduling 结构体排序 优先队列 最小堆 贪心
    解决思路 排序:首先将所有工作按照截止时间 D_i 进行排序。 优先队列:使用一个最小堆来存储当前选择的工作的利润。 选择工作:遍历所有工作,如果当前工作的截止时间大于堆的大小,则将该工作加入堆中;否则,如果当前工作的利润大于堆顶的利润,则替换堆顶的工作。#include......
  • 3319 哈夫曼树 优先队列 最小堆
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e3+10,inf=0x3f3f3f3f;//优先队列(最小堆),用于存储叶结点的权值priority_queue<int,vector<int>,greater<int>>q;intn,ans,x;intmain(){//读取叶结点的数量......
  • WPF下使用FreeRedis操作RedisStream实现简单的消息队列
    RedisStream简介RedisStream是随着5.0版本发布的一种新的Redis数据类型:高效消费者组:允许多个消费者组从同一数据流的不同部分消费数据,每个消费者组都能独立地处理消息,这样可以并行处理和提高效率。阻塞操作:消费者可以设置阻塞操作,这样它们会在流中有新数据添加时被唤醒并开始......
  • Java中的队列数据结构及其应用
    Java中的队列数据结构及其应用队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即最先插入的元素最先被移除。队列的基本操作包括入队(enqueue)、出队(dequeue)和查看队头元素(peek)。本文将介绍队列的基本结构、操作及在JDK中的应用。队列的基本结构一个简单的队列可以用数组或......
  • 算法题:用队列实现一个链表
    下面是添加了注释的ListNode类和LinkedListQueue类,以帮助理解每个部分的功能和目的://定义链表节点类,用于存储队列中的元素classListNode{intval;//存储节点的值ListNodenext;//指向下一个节点的指针//构造函数,用于创建新的节点ListNod......
  • 队列的深度解析:链式队列的实现
    引言队列是一种广泛应用于计算机科学的数据结构,具有先进先出(FIFO)的特性。在许多实际应用中,例如任务调度、缓冲区管理等,队列扮演着重要角色。本文将详细介绍队列的基本概念,并通过链表实现一个简单的队列。一、基本概念1.1定义队列是一种线性数据结构,遵循先进先出(FIFO,Firs......
  • 循环队列入队出队
    队列队列特性:先进先出限定插入操作只能在队尾进行,而删除操作只能在队头进行。循环队列:一种线性数据结构,其操作表现基于先进先出,队尾被连接在队首之后以形成一个循环。循环队列的操作与普通队列类似,但又有独特的优点下面给出一些循环队列的操作函数:队列创建、入队、......
  • 单调队列优化DP解题报告(uoj转)
    Fence\(K\)很小,考虑\(K\)开一维,\(N\)开一维\(f_{i,j}\)表示前\(i\)个工匠粉刷前\(j\)个木板的最大花费\(f_{i,j}=\min_{k=j-l_i}^{s_i-1}f_{i-1,k}+(j-k)\cdotp_i\)拆开为\(f_{i,j}=f_{i-1,k}-k\cdotp_i+j\cdotp_i\)\(i\)固定时维护\(f_{i-1,k}-k\cdotp_i\)的最小......