原题链接  https://www.luogu.org/problemnew/show/P2058

这道题昨天qyf大佬刚给我们讲了一下,所以今天就把它做啦!

qyf大佬的思路和我的是一样的(其实是借鉴了qyf大佬的思路),但是由于他是用的指针+动态数组来实现的,这搞得我有些懵,今天仔细一想(没看题解QwQ~)发现可以用队列来实现,所以为了记录这个思路,写了一篇队列的博客。

想看指针+动态数组实现的同学们戳这里,还送屠龙宝刀哦~ 传送门

首先这是一道模拟题,思路也很简单:

1. 题目中要求有多少个不同的国籍,所以我们先开一个 nat 数组类似于桶排那样来记录第 i 个国籍有多少人;

2. 对于当前到来的船,我们可以将这艘船的所有乘客全入队(注意是乘客!),他们维护两个信息:到来的时间 t 和国籍 nation;

3. 我们要统计 ( t- 86400,ti ] ,所以我们要有一个 delete 操作将队列里所有 t <= ti - 86400 的乘客弹出队列,同时注意对应的国籍人数减一;

4. 考虑到 nat 记录的是国籍的人数,那么我们可以想到:若 nat [ i ] 从一个大于0的数减到了0,那么不就说明这个国籍就没有了?此时的国籍数kind就要 -1;同理若 nat [ i ] 从0加了一个正数,说明该国籍出现了,那么此时的国籍数kind 就要 +1;

5. 然后我们输出kind 即可;

代码如下:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
struct people
{
int t,nation;
}a[];
queue<people> q;
int n,num,guo,kind,t[],vis[];
void delet(int tim)
{
people f=q.front(); //因为我们是按照时间顺序来将乘客入队的,所以队首乘客的t一定最小
while(f.t<=tim)
{
q.pop();
vis[f.nation]--; //对应国籍人数减一
if(vis[f.nation]==) kind--; //国籍人数减到0,说明这种国籍消失,国籍数kind减一
f=q.front();
}
return ;
}
int main()
{
n=read(); //n艘船
for(int i=;i<=n;i++)
{
t[i]=read(); //这一艘船到来的时间
num=read(); //乘客人数
for(int j=;j<=num;j++)
{
guo=read(); //所属国籍
if(!vis[guo]) kind++; //如果之前这种国籍的人数为0,说明多了一种国籍
vis[guo]++;
q.push((people){t[i],guo});//入队,维护时间t 和国籍nation
}
delet(t[i]-); //删除t[i]-86400以前的船,注意要放在入队操作之后
printf("%d\n",kind);
}
return ;
}

P2058 海港的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P2058 海港 题解

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  3. (寒假集训)洛谷 P2058 海港

    小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船,他记录了 ...

  4. 洛谷P2058 海港

    题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船 ...

  5. 洛谷 P2058 海港(模拟)

    题目链接:https://www.luogu.com.cn/problem/P2058 这是一道用手写队列模拟的一道题,没有什么细节,只是注意因为数不会很大,所以直接用数作为数组下标即可,不用用map ...

  6. 洛谷——P2058 海港

    题目传送 由于于题目保证输入的ti是递增的,所以发现当我们统计完一艘船的答案后,这个答案多少会对下一艘船的答案有贡献.同时还发现如果对每个艘船都记录他的乘客在整个数据出现的所有国籍中相应出现的次数,在 ...

  7. P2058 海港 (洛谷)

    这个题复制过来真的有点恶心,懒得手打,以后再搬题面吧. 今天我双更了,AC这个题我就完成某谷春令营第一课的作业了(假的) 这个题是个双指针.非常友善.一直往里读入就可以了,遇见不是一条船的乘客输出这一 ...

  8. [P2058][NOIP2015]海港 (模拟)

    %%%ADMAN #include<cstdio> using namespace std; int n,tot,now,ans,h; ],k[],a[],sum[]; int main( ...

  9. noip2016海港

    题目描述 Description 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只 ...

随机推荐

  1. (二)XML基础(2)

    三.解析 服务端解析 JDK:            DOM            SAX            JAXB    java and xml Binding 开源(一般都是用开源的)   ...

  2. Abp 领域事件简单实践 <四> 聚合根的领域事件

    聚合根有个 DomainEvents 属性. 首先聚合根是一个实体.这个实体的仓储有变化(增删改)的时候,会触发这个DomainEvents 里的事件.就像EventBus.Trigger一样. pu ...

  3. OSI的七层网络模型

    一.概念七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系.它是一个七层的.抽象 ...

  4. 再谈.NET委托(delegate、Func<>)

    为了演示委托,我们先来定义一个方法:public static bool IsTen(int i){    return i == 10 ? true : false;} 如果要用自定义委托,则需要声 ...

  5. string+DFS leetcode-17.电话号码下的字母组合

    题面 Given a string containing digits from 2-9 inclusive, return all possible letter combinations that ...

  6. Array+DP leetcode-11.装更多的水

    11. Container With Most Water 题面 Given n non-negative integers a1, a2, ..., an , where each represen ...

  7. 关于Http协议与TCP协议的一些简单理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  8. 《数据结构与算法之美》 <03>数组:为什么很多编程语言中数组都从0开始编号?

    提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常 ...

  9. IBM XIV

    参考:https://www.doit.com.cn/p/author/xigua 参考:http://www.doit.com.cn/p/196056.html 图片说明: IBM XIV存储系统采 ...

  10. 搭建简单的mongod服务器

    1.首先,创建一个叫做mongodb_simple的目录,进入到目录中. 2.创建文件夹:data,用来存储数据库的数据文件. 3.创建文件夹:log,用来存储数据库的日志文件. 4.创建文件夹:bi ...