1284 海港 队列 模拟

思路解释

 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;
}

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+10;
struct node{
    int t,gj; //时间,国籍 
};
int n,ans; //ans当前岛上的国籍数 
int vis[N]; //vis[i]:国籍i的人数 
queue<node> q; //酒店队列 
int main()
{
    cin >> n; //n艘船 
    for(int i = 1; i <= n; i++)
    {
        int t,k; //第i艘船t时间到达,船上k个人 
        cin >> t >> k;
        for(int j = 1; j <= k; j++)
        {
            int x; cin >> x; //每个人的国籍
            q.push({t,x});
            vis[x]++; //x的国籍数+1 
            if(vis[x] == 1) ans++;
        }
        //输出每艘船到达的时候国籍种类数 
        while(t - q.front().t >= 86400)
        {
            int x = q.front().gj;
            vis[x]--; //国籍x的人减少
            if(vis[x] == 0) ans--; //某个国籍的人数彻底没了
            q.pop(); 
        } 
        cout << ans << endl;
    }
    return 0;
}

 

posted @ 2024-09-30 18:03  CRt0729  阅读(16)  评论(0编辑  收藏  举报