L2-042 老板的作息表 & L1-088 静静的推荐

输入格式:

输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hhmmss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 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");
}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值