学习之路(1)-挑战程序设计竞赛编程之路-贪心初步

最近学到了第二章的贪心算法部分-看到了区间调度问题 正好回顾了bjut校内选拔赛的一个题






181B:上课上课上课

总时间限制: 
1000ms
内存限制: 
256000kB
描述

ACSync 是个上课狂,大学期间曾立志要上完大学里所有的课,假设所有课都是年年开并且上课时间不变,聪明的你快来帮帮他算一下他的鸿鹄之志能否终成正果?

输入
​第一行为 2 个数 N, M,分别表示课程的总数和 ACSync 可以上课的总年数;
接下来的 N 行,第 i 行为两个整数 Ai, Bi (Ai <= Bi),表示第 i 门课程的上课时间 [Ai, Bi]。

如果两门课的上课时间 [Ai, Bi] 和 [Aj, Bj] 有重合,则这两门课不能在同一年上。

对于全部测试用例,1 <= N <= 1 000; 1 <= M <= 1 000; 1 <= Ai <= Bi <= 1 000 000 000。
输出
ACSync 能否在 M 年内学完所有课程?若是,输出「Yes」,否则输出「No」。
样例输入
​3 2
1 2
2 3
3 4
样例输出
Yes
提示
测试样例(具体不唯一):

1 2 和 3 4 在第一年;
2 3 在第二年;
故可以。
来源
​nil

























如题所示,颇有感触,遂上代码,


#include<iostream>
#include<cstdio>
#include<algorithm> 
#define Max 50000
using namespace std;
pair<int, int> it[Max];
int s[Max];
int t2[Max];
int used[Max]{};
int n;
bool cmp(pair<int, int> a, pair<int, int> b) {
	return a.second < b.second;
}
int main()
{
	int i, k, j = 0;
	cin >> n >> k;
	for (i = 0; i < n; i++)
	{
		scanf("%d %d", &s[i], &t2[i]);
	}
	for (i = 0; i < n; i++)
	{
		it[i].first = t2[i];
		it[i].second = s[i];
	}
	sort(it, it + n, cmp);
	int cnt = 0, t = 0;

	for (j = 0; j < k; j++)
	{

		t = 0;
		for (i = 0; i < n; i++)
		{
			if (t < it[i].second && (!used[i]))//选取最早的 
			{
				cnt++;
				t = it[i].first;
				used[i] = 1;
			}

		}
	}




	if (cnt == n) printf("Yes\n");
	else printf("No");
	//printf("%d\n",cnt);
	return 0;
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值