输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:
hh:mm:ss - hh:mm:ss
其中 hh
、mm
、ss
分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。
输出格式:
按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。
输入样例:
8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00
输出样例:
04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59
当时见到望而却步,当时觉得处理不了输入和输出,排序也没想到( - 前后有空格呀!。。。)
第一个用结构体,第二个用 vector pair 第三个 在第二个的基础上优化下
#include<bits/stdc++.h>
using namespace std;
struct T
{
string l,r;
};
bool cmp(T t1, T t2)
{
return t1.l < t2.l;
}
int main()
{
int n;
cin >> n;
string a, b,c;
vector<T> v;
while (n--)
{
cin >> a >> c >> b;
T t;
t.l = a; t.r = b;
v.push_back(t);
}
sort(v.begin(), v.end(),cmp);
if (v[0].l != "00:00:00") cout << "00:00:00" << " - " << v[0].l<<endl;
for (int i = 0;i < v.size()-1;i++)
{
if (v[i].r != v[i + 1].l) cout << v[i].r << " - " << v[i + 1].l << endl;
}
if (v[v.size() - 1].r != "23:59:59")
cout<< v[v.size() - 1].r << " - " << "23:59:59";
system("pause");
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string a, b,c;
pair<string, string> p;
vector<pair<string,string>> v;
while (n--)
{
cin >> a >> c >> b;
p = make_pair(a, b);
v.push_back(p);
}
sort(v.begin(), v.end());
if (v[0].first != "00:00:00") cout << "00:00:00" << " - " << v[0].first <<endl;
for (int i = 0;i < v.size()-1;i++)
{
if (v[i].second!= v[i + 1].first)
cout << v[i].second << " - " << v[i + 1].first << endl;
}
if (v[v.size() - 1].second != "23:59:59")
cout<< v[v.size() - 1].second << " - " << "23:59:59";
system("pause");
}
#include<bits/stdc++.h>
#include<utility>
using namespace std;
int main()
{
int n;
cin >> n;
vector<pair<string,string>> v;
while (n--)
{
string a, b,c;
cin >> a >> c >> b;
v.push_back({a,b});
}
v.push_back({"","00:00:00"});
v.push_back({"23:59:59",""});
sort(v.begin(), v.end());
for (int i = 0;i < v.size()-1;i++)
{
if(v[i].second!=v[i+1].first)
cout<<v[i].second<<" - "<<v[i+1].first<<endl;
}
}
天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
- 只考虑得分不低于 175 分的学生;
- 一共接受 K 批次的推荐名单;
- 同一批推荐名单上的学生的成绩原则上应严格递增;
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受。
给定全体参赛学生的成绩和他们的 PAT 考试成绩,请你帮静静姐算一算,她最多能向企业推荐多少学生?
输入格式:
输入第一行给出 3 个正整数:N(≤105)为参赛学生人数,K(≤5×103)为企业接受的推荐批次,S(≤100)为该企业的 PAT 面试分数线。
随后 N 行,每行给出两个分数,依次为一位学生的天梯赛分数(最高分 290)和 PAT 分数(最高分 100)。
输出格式:
在一行中输出静静姐最多能向企业推荐的学生人数。
输入样例:
10 2 90
203 0
169 91
175 88
175 0
175 90
189 0
189 0
189 95
189 89
256 100
输出样例:
8
样例解释:
第一批可以选择 175、189、203、256 这四个分数的学生各一名,此外 175 分 PAT 分数达到 90 分的学生和 189 分 PAT 分数达到 95 分的学生可以额外进入名单。第二批就只剩下 175、189 两个分数的学生各一名可以进入名单了。最终一共 8 人进入推荐名单。
考试的时候直接傻眼,今天再看,还是没能一下子抓住问题的关键。以后做题先多去理解题意了!本来想着拿结构体做或者deque pair这样的去做,发现进展不了呀,对问题继续理解。其实就是记录每个分数的人数 和 超过pta面试分数线的人数(如果这个分数下 有人超过面试分数,那么他就可以带走一个没过分数线的人,只需细化分一下各个情况)
#include<bits/stdc++.h>
using namespace std;
int a[310],b[310];//a记录该分数下的人数,b记录过面试分数线的人数
int main()
{
int n, k, s;
cin >> n >> k >> s;
int x, y;
while (n--)
{
cin >> x >> y;
a[x]++;
if(y>=s) b[x]++;
}
int ans = 0;
while (k--)
{
for (int i = 175;i <= 305;i++)
{
if (b[i] && a[i] > b[i]) {
ans += b[i] + 1;
a[i] = a[i] - b[i] - 1;
b[i] = 0;
}
else if (b[i] && a[i] == b[i]) {
ans += b[i];
a[i] = b[i] = 0;
}
else if (!b[i] && a[i]) ans++,a[i]--;
}
}
cout << ans;
system("pause");
}