信息学奥赛一本通 ybt 1975:【16NOIP普及组】海港 | 洛谷 P2058 [NOIP2016 普及组] 海港

news/2024/11/17 19:25:55/

【题目链接】

ybt 1975:【16NOIP普及组】海港
洛谷 P2058 [NOIP2016 普及组] 海港

【题目考点】

1. 模拟

2. 队列

【解题思路】

解法1:设队列,每个人是队列中的一个元素

由于人数总和(即k的加和)最大为 3 ∗ 1 0 5 3*10^5 3105,可以把每个人作为一个元素保存在队列中。
设计数数组c,c[i]表示第i国籍的人数。
设结构体Peo表示一个人,每个人包含属性:时间time、国籍nation。
t时刻有船到岸:

  • 先将队列中所有到达时间time比当前时间t早86400以上的人出队。每出队1个人,该国籍的人数减1。如果该国籍的人数变为0,则总国籍数量减1。
  • 而后把该船上所有人加入到队列中,对于每个入队的人,这个人的国籍的人数加1。如果该国籍的人数从0变为1,则总国籍数量加1。

每次有船到岸,就输出一下国籍总数。

解法2:设队列,每条船是队列中的一个元素

每条船为一个元素,包含属性vector类型的nation,保存所有人的国籍,以及time表示时间。
注意:nation必须设为长度可变的vector,这样可以节省空间。如果设为数组,则会内存超限。
t时刻有船到岸:

  • 先将队列中所有到达时间time比当前时间t早86400以上的船出队。每出队1条船,遍历该船上的所有人,每人对应的国籍人数减1。如果该国籍的人数变为0,则总国籍数量减1。
  • 而后把该船加入到队列中,对于每个船上的人,这个人的国籍的人数加1。如果该国籍的人数从0变为1,则总国籍数量加1。

每次有船到岸,就输出一下国籍总数。

【题解代码】

解法1:使用队列,每个人是队列中的一个元素

#include <bits/stdc++.h>
using namespace std;
struct Peo
{int time, nation;Peo(){}Peo(int a, int b):time(a), nation(b){}
};
int c[100005];//c[i]:第i国籍人数 
int main()
{queue<Peo> que;int n, t, k, x, ct = 0;//ct:总国籍数 cin >> n;for(int i = 1; i <= n; ++i){cin >> t >> k;while(que.empty() == false && que.front().time <= t-86400)//只要队列不空 {//到港时间que.front().time比当前时间t早86400秒以上的人都出队 int nat = que.front().nation;if(--c[nat] == 0)//nat国籍的人数减1,如果该国籍人数为0 ct--;//总国籍数量减少 que.pop(); }for(int j = 1; j <= k; ++j){cin >> x;if(++c[x] == 1)//x国籍人数增加,如果从0变为1 ct++;//总国籍人数增加 que.push(Peo(t, x)); }cout << ct << endl;}return 0;
}

解法2:设队列,每条船是队列中的一个元素

#include <bits/stdc++.h>
using namespace std;
struct Ship
{int time;vector<int> nation;
};
int c[100005];//c[i]:第i国籍人数 
int main()
{queue<Ship> que;int n, t, k, x, ct = 0;//ct:总国籍数 cin >> n;for(int i = 1; i <= n; ++i){cin >> t >> k;while(que.empty() == false && que.front().time <= t-86400)//只要队列不空 {//到港时间que.front().time比当前时间t早86400秒以上的人都出队 for(int nat : que.front().nation){if(--c[nat] == 0)//nat国籍的人数减1,如果该国籍人数为0 ct--;//总国籍数量减少 	}que.pop(); }Ship ship;ship.time = t;for(int j = 1; j <= k; ++j){cin >> x;ship.nation.push_back(x);if(++c[x] == 1)//x国籍人数增加,如果从0变为1 ct++;//总国籍人数增加 }que.push(ship);cout << ct << endl;}return 0;
}

http://www.ppmy.cn/news/1043657.html

相关文章

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…

最大公约数题--夏令营

题目&#xff1a; 知识点&#xff1a; 1。数论-欧几里得算法-gcd最大公因数性质 证明性质2&#xff0c;为什么两组的公约数相等&#xff0c;同样&#xff0c;最大公约数也相等 算法表示 int gcd(int a, int b) {return b 0 ? a : gcd(b, a % b); } 2.分析题目&#xff1a;…

day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

目录&#xff1a; 解题及思路学习 654.最大二叉树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最…

批量将excel中第5列中内容将人名和电话号码进行分列

使用Python可以使用openpyxl库来实现批量将Excel中第5列的内容分列为人名和电话号码的操作。下面是示例代码&#xff1a; import openpyxl def split_names_and_phone_numbers(file_path, sheet_name): # 加载Excel文件 workbook openpyxl.load_workbook(file_path) …

前端对文件转换处理的一些常用方法

文章目录 0&#xff0c;前言1&#xff0c;将图片的url网络链接(http://) 转为base64格式2&#xff0c;将base64的图片数据转换为file文件3&#xff0c;将以base64的图片数据转换为Blob4&#xff0c;将file文件转化为base645&#xff0c;将file文件转换为Blob6&#xff0c;获取文…

在海外如何进行应用商店的关键词优化

分析市场&#xff0c;了解我们的应用类别&#xff0c;将我们的应用与竞争对手的优点和缺点进行比较&#xff0c;找到市场上的空白或所谓未满足的需求&#xff0c;并思考如何填补。 1、应用商店关键词优化。 关键词优化的目的是找到最相关的关键词 &#xff0c;并测试应用元数据…

Focus-DETR利用双重注意力机制重建编码器,打造最强目标检测模型

前期的文章我们介绍了DETR模型,我们知道DETR模型首先使用CNN卷积神经网络搜集图片的核心特征点,然后把这些特征点整合起来,通过embedding方法,把特征图片转换到特征向量空间。然后根据标准Transformer模型的编码器与解码器进行注意力机制的计算,最后把计算后的数据进行图片…

稚晖君人形机器人问世:大模型加持,会自己换胳膊,要上生产线造车

从零开始,不到半年就造出人形机器人,还自带软硬件体系。 大模型技术的新一波浪潮:具身智能,已经有了重要进展。 刚刚,稚晖君的创业公司「智元机器人」开了自己的第一场发布会。 以「天才少年」身份加入华为的稚晖君(彭志辉)于去年底宣布离职创业,人们都在关注他在机器…