队列
队列
1.AcWing829.模拟队列12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include<iostream>using namespace std;const int MAX = 100010;typedef struct { int head; int tail; int data[MAX];} Queue;Queue queue1;void queue_push(Queue &queue, int x) { queue.data[queue.tail] = x; queue.tail++;}int queue_pop(Queue &queue) { int ret = queue.data[queue.head]; queue.head++; return ret;}int queue_head(Queue &queue) { return queue.data[queue.head];}bool queue_empty(Queue &queue) { if (queue.head < queue.tail) return false; return true;}int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int m; cin >> m; string opt; int x; int data; while (m--) { cin >> opt; if (opt == "push") { cin >> x; queue_push(queue1, x); } else if (opt == "pop") { queue_pop(queue1); } e ...
报数
报数
原题链接:https://oj.haizeix.com/problem/382
N 个人围成一圈,编号分别为 1,2,3……N 第一个人从 1 报数,按照编号顺序依次报数,
报 M 的人会离开队伍,然后下一个人会继续从 1 开始报数,直到剩下一人,剩下的人的编号是多少?
输入:
共一行两个数 N 和 M
输出:
输出一个数表示最后一人的编号。
样例:
17 3
14
代码1234567891011121314151617181920212223#include<iostream>#include<queue>using namespace std;queue<int> que;int main() { //队列模拟约瑟夫环 int n, m; cin >> n >> m; for(int i = 1; i <= n; ++i) que.push(i); int now = 1;//更新报1的位置 while(que.size() != 1){ if (now != m) { que.push(que.front()); now++; } else { now = 1; } que.pop(); } cout << que.front() << endl; return 0;}
海港
海港
原题链接:https://oj.haizeix.com/problem/385
小李是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。
小李对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第 i 艘到达的船,他记录了这艘船到达的时间 ti (单位:秒),船上的乘 客数 ki,以及每名乘客的国籍 xi,1, xi,2,…, xi,k。
小李统计了 n 艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的 24 小时( 24 小时= 86400 秒)内所有乘船到达的乘客来自多少个不同的国家。
形式化地讲,你需要计算 n 条信息。对于输出的第 i 条信息,你需要统计满足 ti − 86400 < tp ≤ ti 的船只 p,在所有的 xp,j 中,总共有多少个不同的数。
输入:
第一行输入一个正整数 n,表示小李统计了 n 艘船的信息。
接下来 n 行,每行描述一艘船的信息:前两个整数 ti 和 ki 分别表示这艘船到达海港的时间和船上的乘客数量,接下来 ki 个整数 xi,j 表示船上乘客的国籍。
保证输入的 ti 是递增的,单位是秒;表示从小李第一次上班开始计时,这艘船在第 ti 秒到达海港。
输出:
输出 n 行,第 i 行输出一个整数表示第 i 艘船到达后的统计信息。
样例:
12345//样例输入131 4 4 1 2 22 2 2 310 1 3
1234//样例输出1344
第一艘船在第 1 秒到达海港,最近 24 小时到达的船是第一艘船,共有 4 个乘客, 分别是来自国家 4,1,2,2,共来自 3 个不同的国家
第二艘船在第 2 秒到达海港,最近 24 小时到达的船是第一艘船和第二艘船,共有 4+2=6 个乘客,分别是来自国家 4,1,2,2,2,3,共来自 4 个不同的国家
第三艘船在第 10 秒到达海港,最近 24 小时到达的船是第一艘船、第二艘船和第 三艘船,共有 4+2+1=7 个乘客,分别是来自国家 4,1,2,2,2,3,3,共来自 4 个不同的国家
123456//样例输入241 4 1 2 2 33 2 2 386401 2 3 486402 1 5
12345//样例输出23334
第一艘船在第 1 秒到达海港 ...
桐桐的新闻系统
桐桐的新闻系统
原题链接:https://oj.haizeix.com/problem/573
桐桐为期末的计算机作业设计了一套新闻系统,他把这套新闻系统称为 Argus。使用这套系统的用户可以向这套系统注册,然后这套系统就会以用户要求发送新闻的时间间隔向用户发送一次新闻。
向 Argus 注册的指令具有这样的格式:Register Qnum Period
Qnum (0 < Qnum ≤ 30000) 是用户的 ID,Period(0 < Period ≤ 3000)是间隔。注册后 Period 秒,结果会第一次到达。
所有的用户都有不同的 Qnum。
桐桐测试了一段时间后,想知道系统前 K 次给谁发送新闻了。如果同一时间发送多个新闻,以 Qnum 的升序排列。
输入:
第一部分是注册指令,每条一行。指令数不超过 1000。此部分以 “ # ” 结束。
第二部分仅一行一个整数 K,K ≤ 10000。
输出:
输出前 K 个新闻发送到的用户的 Qnum,每行一个。
样例:
1234Register 2004 200Register 2005 300#5
1234520042005200420042005
代码思路:每次取时间最小的进行输出,同为时间最小时再按照ID进行排序,故应该使用优先队列进行处理。
1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>#include<queue>#include<string>using namespace std;struct node { int id; int offset;//获得新闻的时间 int next;//下一次获得新闻的时间(排序依据) bool operator<(const node &t) const {//重载小于号 实现大于号的功能(自定义优先队列的排序规则) if (this->next == t.next) return this->id > t.id; return this->next > t.next; }};priority_ ...