括号画家
括号画家
原题链接:https://oj.haizeix.com/problem/265
Candela 是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。
这一天,刚刚起床的 Candela 画了一排括号序列,其中包含小括号 ()、中括号 [] 和大括号 {},总长度为 N。
这排随意绘制的括号序列显得杂乱无章,于是 Candela 定义了什么样的括号序列是美观的。
1231.空的括号序列是美观的;2.若括号序列 A 是美观的,则括号序列 (A)、[A]、{A} 也是美观的;3.若括号序列 A、B 都是美观的,则括号序列 AB 也是美观的;
例如 [(){}]() 是美观的括号序列,而 )({)[}]( 则不是。
现在 Candela 想在她绘制的括号序列中找出其中连续的一段,满足这段子序列是美观的并且长度尽量大。你能帮帮她吗?
输入:
1 个长度为 N 的括号序列。(5 ≤ N ≤ 10000)
输出:
一个整数,表示最长的美观的连续子序列的长度。
样例:
1[[[[]]{}]]
110
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include<iostream>#include<stack>#include<string>using namespace std;stack<char> stack1;stack<int> stack2;string str;int ans;void ansUpdate(int i) { stack1.pop(); stack2.pop(); ans = max(ans, i - stack2.top());}void stack12Clear(int i) { while (!stack1.empty()) { stack1.pop(); stack2.pop(); } stack1.push('#'); stack2.pus ...
仓库日志
仓库日志
原题链接:https://oj.haizeix.com/problem/379
某仓库购入新的货物并将一部分老货物发出,这个过程会有软件对数据以日志形式保存,规则如下:
该日志记录了两类操作:
第一类操作为入库操作,以及该次入库的货物数量;
第二类操作为出库操作。
这些记录都严格按时间顺序排列。入库和出库的规则为先进后出,即每次出库操作货物为当前在仓库里所有货物中最晚入库的货物。
为了便于分析,现在加入了第三类查询操作,每次查询时输出当前仓库数量最多的货物的数量。
输入:
包含 N+1行:
第一行为 1 个正整数 N,对应于日志内所含操作的总数。
接下来的 N 行,分别属于以下三种格式之一:
0 X :一次入库操作,正整数 X 表示该次入库的货物的数量
1 :一次出库操作,(就当时而言)最后入库的货物出库
2 :一次查询操作,要求分析程序输出当前仓库内数量最多的货物的数量
当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出 0。
初始时仓库状态为空。
输出:
输出行数等于日志中查询操作的次数。每行为一个正整数,表示查询结果。
样例:
1234567891011121314130 10 220 40 221211212
1234524410
代码12345678910111213141516171819202122232425262728293031323334#include<iostream>#include<stack>using namespace std;stack<int> stack1;//存储仓库货物的数量stack<int> stack2;//存储当前仓库内数量最多的货物数量int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { int x; cin >> x; switch (x) { case 0://入库操作(入栈操作) int num; cin >> num; stack1.push(num); if (stack1.size() == 1) stack2.push(num); else ...
讲话模式
讲话模式
原题链接:https://oj.haizeix.com/problem/577
每个人讲话都有口头禅,现在给出一个字符串,需要求出其中出现次数最多的单词。
输入:
输入一行,若干个长度小于或等于 10 的只包含大小写字母的字符串。
输出:
输出一行,为出现次数最多的单词和它出现的次数,以一个空格隔开。如果出现次数最多的单词有多个,则输出字典序最小的那个。这个单词必须完全以小写的形式输出。注意,所说的单词不区分大小写字母。
样例:
1Can a can can a can It can
1can 5
代码
解法1:定义两个变量string、int,轮回最终保留一个出现次数最多的结果,如果有多个则保留字典序最小的单词。
解法2:当处理完所有的数据后,遍历一遍数组保留最终的结果。
123456789101112131415161718192021222324252627282930#include<iostream>#include<map>#include<string>using namespace std;map<string, int> mp;string ans;//最终答案int count;//答案出现的次数int main() { string t; //大小写转换 while (cin >> t) { for (int i = 0; i < t.size(); ++i) { if (t[i] >= 'A' && t[i] <= 'Z') { t[i] += ('a' - 'A'); } } mp[t]++; } //数据处理 使用有序map for (auto it = mp.begin(); it != mp.end(); ++it) { if (it->second > count) { ans = it->first; count = it->second; } } cout << ...
上网统计
上网统计
原题链接:https://oj.haizeix.com/problem/566
在一个网络系统中有 N 个用户、 M 次上网记录。每个用户可以自己注册一个用户名,每个用户名只包含小写字母且长度小于 1000 的字符串,每次上网日志里都会有记录,现在请统计每个用户每次浏览了多少个网页。注意,有可能有用户没有访问记录。
输入:
第 1 行包含两个正整数 N (1 ≤ N ≤ 1000) 和 M (1 ≤ M ≤ 5000)。
第 2 ~ M+1 行,每行包含 2 个字符串,分别表示用户名和浏览的网页名。
输出:
共 x 行,x 表示有访问记录的用户数量,
每行的第一个字符串时用户名,接下来的若干字符串是这个用户依次浏览的网页名(之间用一个空格隔开)。
按照用户名出现的次序排序输出。
样例:
123456785 7goodstudyer bookshopalikespacea spacewebgoodstudyer bookshopblikespaceb spaceweblikespacec spaceweblikespacea juiceshopgameplayer gameweb
12345goodstudyer bookshopa bookshopblikespacea spaceweb juiceshoplikespaceb spaceweblikespacec spacewebgameplayer gameweb
代码12345678910111213141516171819202122232425262728293031323334353637#include<iostream>#include<string>#include<vector>#include<unordered_map>using namespace std;int cnt;//当前用户访问记录所在的行数int n;//用户的个数int recordNum;//上网记录的条数unordered_map<string, int> mp;//用于记录vector在第几行的信息(unordered_map满足按用户名出现的次序进行输出)int main() { cin >> n >> r ...
报数
报数
原题链接: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_ ...
STL基本使用
STL基本使用
STL六大组件:
容器
适配器
空间分配器:malloc
迭代器:高级指针
算法库:sort
仿函数:一个类重载一个括号
1.string类
string常用方法
find(what, start)
substr(start, length)
insert(start, what)
replace(start, length, what)
size()\length()
注意:find()返回值为第一个目标出现的下标值,若没有找到将返回string::npos(-1)
123456789101112131415161718192021222324252627#include <iostream>#include <string>using namespace std;int main(){ string str = "ABCDEF"; //1.输出字符串长度 cout << str.size() << endl; //2.查找字符串DE的位置 cout << str.find("DE") << endl; //3.输出没有查找到的结果 cout << (int)str.find("DE", 5) << endl; //4.字符串截取 cout << str.substr(3, 2) << endl; //5.字符串插入 str.insert(1, "abc"); cout << str << endl; //6.字符串替换 str.replace(2, 5, "000"); cout << str << endl; //7.一次性读入一行包含空格的字符串 string str1; getline(cin, str1); cout << str1 << endl; return 0;} ...
伐木
伐木
原题链接:http://oj.haizeix.com/problem/82
又到了伐木的季节,亚布力林业局引进了一台新的伐木设备:
这种设备能设定一个高度值(整数),并将所有树木大于此高度的部分锯下来。
例如,有四棵树的高度分别为20M、17M、15M、10M,把设备的高度设定为 15M,那么设备运行过后树的高度变为15M、15M、15M、10M(从第一棵树锯下 5M,从第二棵树锯下 2M,总共锯下 7M)。
现在林业局需要至少锯下长度为M米的木头,因为国家推行的环保政策,林业局不能锯下过多的木材。
需要将伐木设备的高度设定为多少才能使得获得的木材至少为 M 米?
换句话说,如果再将高度升高一米,将得不到 M 米的木材,如果将高度减少一米,将不能通过环保政策。
输入:
第一行两个整数 N 和 M,N 表示树木的数量,M 表示需要木材的长度。(1 ≤ N ≤ 1000000 , 1 ≤ M ≤ 2000000000)
第二行 N 个整数表示每棵树的高度(N ≤ 1000000000)。所有数据必有解。
输出:
一个整数,表示伐木的最高高度。
样例:
124 920 17 15 10
114
1.思路
根据设定伐木设备的设定长度num[i],利用fun()函数进行计算,能求出其能够获得的伐木量
根据当前能够获取的伐木量s与题目给定真实需要的伐木量m进行比较,从而调整左右指针
当左右指针逼近到一定范围时,表示最佳答案已经找到
2.代码实现1234567891011121314151617181920212223242526272829303132333435363738#include<iostream>using namespace std;long long n, m, num[1000005], rawr;long long func(long long x) { long long t = 0; for (int i = 0; i < n; ++i) { if (num[i] > x) { t += num[i] - x; } } return t;}long long bs() { ...
数列分段
数列分段
原题链接:http://oj.haizeix.com/problem/391
对于给定的一个长度为 N 的正整数数列 Ai ,现要将其分成 M(M ≤ N)段,并要求每段连续、且每段和的最大值最小。
关于最大值最小:
例如一数列 4 2 4 5 1 要分成 3 段,
将其如下分段:[4 2] [4 5] [1]:第1段和为 6、第 2 段和为 9、第 3 段和为 1,和最大值为 9。
将其如下分段:[4] [2 4] [5 1]:第1段和为 4、第 2 段和为 6、第 3 段和为 6,和最大值为 6。
并且无论如何分段,最大值不会小于 6。
所以可以得到,要将数列 4 2 4 5 1 分成 3 段,每段和的最大值最小为 6。
输入:
第一行两个整数 N , M。(1 ≤ M ≤ N ≤ 100,000)
接下来 N 行,每行一个数,表示 Ai 。(1 ≤ Ai ≤ 100,000,000)
输出:
一个正整数,即每段和最大值最小为多少。
样例:
1234565 342451
16
1.思路
2.代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include<iostream>using namespace std;long long n, m, num[100005], rawl, rawr;long long func(long long x) { long long t = 0, now = 0; for (int i = 0; i < n; ++i) { if (now + num[i] > x) { t++; now = num[i]; } else if (now + num[i] == x) { t++; now = 0; } else { now += num[i]; } } if (now != ...