Problem Description “今年暑假不AC?”
Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
Sample Output 5 |
解题: 最多 即贪心 一个节目的开始/结束 是一个整体 故使用 结构体表示start/end
先把所有节目的按照 开始时间先后 进行排序; 排序 : 同时开始 先完的在前 或 不同时开始 先开始的在前
有两种可能 先开始的先完 先开始的后完;
我们统计先开始先完的个数;
#include<iostream>
#include<algorithm> // sort 调用的头文件
using namespace std;
#define N 110
struct time {
int s,e;
} a[N];
bool cmp (time a,time b){ // 排序方式
if (a.s==b.s)
return a.e<b.e;
return a.s<b.s;
}
int main (){
int n;
while (cin>>n,n){
for (int i=0;i<n;i++){
cin>>a[i].s>>a[i].e;
}
sort(a,a+n,cmp);
int nowendtime=a[0].e;
int sum=1;
for (int i=1;i<n;i++){
if (a[i].s>=nowendtime){
sum++;
nowendtime=a[i].e;
}
else if (nowendtime>a[i].e)
nowendtime=a[i].e;
}
cout<<sum<<endl;
}
return 0;
}
/* 区间调度问题:
有n项工作 分别在s 时间开始 在t 时间结束 每项工作都可以参与 ;且必须全程参与 工作时间不可以重叠
(开始 结束的时间重叠 也不允许) 那么 你最多可以参加多少项工作?
*/
#include<iostream >
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000;
int n;
int s[maxn],t[maxn];
pair <int ,int> itv[maxn];
void solve(){
for(int i=0;i<n;i++){
itv[i].first = t[i];//结束时间
itv[i].second=s[i]; //开始时间
}
sort(itv,itv+n);
int ans=0,T=0;
for (int i=0;i<n;i++){
if(T<itv[i].second){
ans++;
T=itv[i].first;
}
}
cout<< ans<<endl;
}
int main (){
cin>>n;
for (int i=0;i<n;i++){
cin>>s[i]>>t[i];
}
solve();
return 0;
}