看见csdn上搜索这个关键词好像没有什么C的代码,所以挂一下。
本人学才浅陋目前还没有学习所谓的“贪心”,纯属靠自己理解解的题,欢迎指正。
#include<stdio.h>
int main() {
int n;
while (scanf_s("%d",&n)!=EOF&&n) {
//输入时间
int ti[100][2] = { 0 },sum=0,min=0,temp;
int e = 1;
for(int i=0;i<n;i++){
scanf_s("%d %d", &ti[i][0],&ti[i][1]);
}
//开始时间从小到大排序排序,为后面挑选做铺垫
for (int j = 0; j < n-1; j++) {
min = ti[j][0];
for (int i = j + 1; i < n; i++) {
if (ti[i][0] < min) {
min = ti[i][0];
temp = ti[j][0];
ti[j][0] = ti[i][0];
ti[i][0] = temp;
temp = ti[j][1];
ti[j][1] = ti[i][1];
ti[i][1] = temp;
}
}
}
//挑选节目
for (int i = 0; i < n-1; i++) {
if (ti[i][1] > ti[i + 1][0]) {//比较前一个结束时间后一个开始时间
if ((ti[i][1] - ti[i][0]) < (ti[i + 1][1] - ti[i + 1][0])) {//比较节目的长段,尽可能看多的节目,就选较短的
sum++;//选择前一个节目
i++;//放弃后一个节目
}
else {//选择后一个节目,sum(节目数)不增加,让其再进入循环查看跟再后一个节目比较
if (i == n - 2) {//若这个节目是最后一个则无需比较,直接加一
sum++;
}
}
}
else {//相邻两个节目没有冲突的情况
if (i == n - 2) sum += 2;//如果两个节目是最后两个,直接加2
else sum++;
}
}
printf("%d\n", sum);
}
return 0;
}