首页 > 其他分享 >洛谷题单指南-线性表-P2058 [NOIP2016 普及组] 海港

洛谷题单指南-线性表-P2058 [NOIP2016 普及组] 海港

时间:2024-03-12 10:34:57浏览次数:25  
标签:24 NOIP2016 队列 线性表 -- 洛谷题 int ans 人数

原题链接:https://www.luogu.com.cn/problem/P2058

题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。

解题思路:

本题需要用到两个关键的数据结构:队列、数组

队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人

每到一只船,需要把时间放入队列,如果距离队首时间超过24小时,则要出队,一直到不超过24小时

每一次入队、出队,都需要更新数组中每个国家的人数

考虑到总人数在3×10^5,队列中可以存{时间,国家},即把一艘船的人拆成多条记录来入队,更便于处理

在更新数组中不同国家的人数过程中,就可以同时更新答案ans变量,比如某个国家的人数从0变1时ans++,从1变0时ans--

100分代码:

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int t, x;
};

queue<node> q;
int p[100005]; //不同国家的人数
int ans;

int main()
{
    int n, t, k, x;
    cin >> n;
    while(n--)
    {
        cin >> t >> k;
        while(k--)
        {
            cin >> x;
            while(q.size() && t - q.front().t >= 86400) //如果队列不空且与队首时间超过24小时,注意>=
            {
                p[q.front().x]--; //减少队首国家的人数
                if(p[q.front().x] == 0) ans--; //更新ans
                q.pop(); //队首出队
            }

            q.push({t, x}); //当前国家的人入队
            p[x]++; //增加x国家的人数
            if(p[x] == 1) ans++; //更新答案
        }
        cout << ans << endl;;
    }   
    
    return 0;
}

 

标签:24,NOIP2016,队列,线性表,--,洛谷题,int,ans,人数
From: https://www.cnblogs.com/jcwy/p/18067746

相关文章

  • 洛谷题单指南-线性表-P1540 [NOIP2010 提高组] 机器翻译
    原题链接:https://www.luogu.com.cn/problem/P1540题意解读:本题模拟内存的调入调出,内存先入先出的特性就是队列。解题思路:本题需要两种数据结构:队列、数组队列用来模拟内存的操作,数组充当hash表用于判断单词在内存是否存在核心逻辑:对于每一个单词,如果内存不存在,查一次词典,再将......
  • 【算法】【线性表】【链表】合并 K 个升序链表
    1 题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1-......
  • 洛谷题单指南-线性表-P1160 队列安排
    原题链接:https://www.luogu.com.cn/problem/P1160题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。解题思路:双向链表关键要实现好两个操作:voidadd(intk,intv);//在第k个节点后增加第v的号节点,即在k号同学右边插入v号同学voiddel(int......
  • 洛谷题单指南-线性表-P1996 约瑟夫问题
    原题链接:https://www.luogu.com.cn/problem/P1996题意解读:约瑟夫问题是队列的典型应用。解题思路:n个人围圈报数,可以直接基于数组实现循环队列操作,再定义额外数组记录每个人是否已经出圈即可。更直观的做法,定义队列,初始放入1~n,然后重复n次,每次从1~m报数,如果报数到m,直接出队,......
  • 洛谷题单指南-线性表-P3613 【深基15.例2】寄包柜
    原题链接:https://www.luogu.com.cn/problem/P3613题意解读:此题很容易想成用二维数组求解,但是最多有10^5*10^5个寄包柜格子,二维数据会爆空间,题目明确各自一共不超过10^7,所以需要动态数据结构vector。解题思路:vector的问题在于需要提前明确空间大小,才能进行随即访问操作,否则可......
  • 洛谷题单指南-线性表-P3156 【深基15.例1】询问学号
    原题链接:https://www.luogu.com.cn/problem/P3156解题思路:简单的数组题,唯一需要注意的是读写的数据量比较大,输入输出最好用scanf、printf100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=2e6+5;inta[N],n,m;intmain(){scanf("%d%d",&......
  • 洛谷题单指南-搜索-P1825 [USACO11OPEN] Corn Maze S
    原题链接:https://www.luogu.com.cn/problem/P1825题意解读:计算最短路,依然是BFS。解题思路:相比传统的最短路迷宫,多了个传输装置,要解决几个关键问题:1、传输装置的存储定义一个数组,vector<node>trans[30],数据的每个元素都是一个vector<node>,里面存两个节点,即一对坐标2、传输......
  • 洛谷题单指南-搜索-P1032 [NOIP2002 提高组] 字串变换
    原题链接:https://www.luogu.com.cn/problem/P1032题意解读:要计算子串变换的最少步数,典型的最短路问题,可以通过BFS求解。解题思路:思路上比较直观,从给定的字符串开始,找有多少种替换可能,依次进行替换,存入队列,继续BFS,过程中记录替换的次数但是,有一些细节还需要注意:1、有多种替换......
  • 洛谷题单指南-搜索-P1162 填涂颜色
    原题链接:https://www.luogu.com.cn/problem/P1162题意解读:要把闭合圈内的0填为2,DFS处理即可。解题思路:由于方阵内只有一个闭合圈,所以闭合圈以外的0一定和边缘相连通,只需要从边缘开始,把0的连通块全部标记为2最后再输出时,2输出0,1输出1,0输出2,即可得解。100分代码:#include<bits......
  • 洛谷题单指南-搜索-P2404 自然数的拆分问题
    原题链接:https://www.luogu.com.cn/problem/P2404题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。解题思路:通过DFS,每次填一个数,填数时从1~n-1逐个填注意两个条件不能继续DFS:1、将填的数之和超过n2、将填的数小于上一次填......