最近学到了第二章的贪心算法部分-看到了区间调度问题 正好回顾了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;
}