问题描述:
给你一个整数n表示总共的节目个数,然后给出n组数据每一组由两个整数组成,分别表示开始时间和结束时间。看你最多能选取几个时间上互不冲突的节目。
题目链接:点击打开链接
思路:
把每组数据以结束时间从小到大排序,每次都选取结束时间最早的节目。(具体看代码)
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAX = 10086;
int main(){
int n;
//分别表示开始时间和结束时间
int B[MAX], E[MAX];
while(~scanf("%d", &n) && n){
int t = 0, cnt = 0;
for(int i = 0; i < n; i++)
scanf("%d%d", &B[i], &E[i]);
//用pair容器,比起二维数组更简洁
pair<int , int> arr[MAX];
//下面要以结束时间排序,所以把E[i]赋给.first
for(int i = 0; i < n; i++){
arr[i].first = E[i];
arr[i].second = B[i];
}
sort(arr, arr + n);
//贪心,去第一个然后同后面的值比较
for(int i = 0; i < n; i++){
if(t <= arr[i].second){
cnt++;
t = arr[i].first;
}else
continue;
}
cout << cnt << endl;
}
return 0;
}