赞
踩
输入第一行给出一个正整数 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;
- }
-
- }
天梯赛结束后,某企业的人力资源部希望组委会能推荐一批优秀的学生,这个整理推荐名单的任务就由静静姐负责。企业接受推荐的流程是这样的:
给定全体参赛学生的成绩和他们的 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");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。