1061: Ckp的约会
Description
今天Ckp打算去约会。大家都知道Ckp是超级大帅哥,所以和他约会的MM也超级多,她们每个人都和Ckp订了一个约会时间。但是今天Ckp刚打算出门的时候才发现,某几个MM的约会时间有冲突。由于Ckp不会分身,还不能和多个MM同时约会,他只能忍痛割爱拒绝掉某些MM。但是Ckp这个花心大萝卜还是不死心,他想知道,他最多可以和多少个MM约会。
Input
输入的第一行包含一个正整数N(0<N<=1000),表示和Ckp约会的MM数。
接下去N行,每行描述一个MM,格式为: Name starttime endtime,表示在[starttime,endtime)这个半开区间是这个MM的约会时间,starttime < endtime。名字由大写或小写字母组成,最长不超过15个字母,保证没有两个人拥有相同的名字,所有时间采用24小时制,格式为XX:XX,且在06:00到23:00之间。
Output
输出的第一行是一个整数M表示Ckp最多可以和多少个MM约会。
接下来那一行就是M个MM的名字,用空格隔开。您可以按照任意的顺序输出。如果存在多个答案,您可以任选一个输出。
Sample Input
4
Lucy 06:00 10:00
Lily 10:00 17:00
HanMeimei 16:00 21:00
Kate 11:00 13:00
Sample Output
3
Lucy Kate HanMeimei
HINT
Source
这是贪心常见的:任务安排问题。就是把区间排序(注意起点还是终点,仔细想想),然后贪心选择就可以了。
#include<bits/stdc++.h>
#define maxn 1010
using namespace std;
struct node{
char s[100];
int st,ed;
bool operator <(const node&a)const{
if(ed!=a.ed) return ed<a.ed;
return st<a.st;
}
}A[maxn];
int main(){
//freopen("in.txt","r",stdin);
int n;
char s[100];
while(cin>>n){
int a,b,c,d;
for(int i=0;i<n;i++){
scanf("%s %d:%d %d:%d",s,&a,&b,&c,&d);
a=a*60+b;c=c*60+d;
strcpy(A[i].s,s);A[i].st=a;A[i].ed=c;
}
sort(A,A+n);
int tmp=-1;
vector<int> v;
for(int i=0;i<n;i++) if(A[i].st>=tmp)//贪心选择即可
v.push_back(i),tmp=A[i].ed;
printf("%d\n",v.size());
for(int i=0;i<v.size();i++)
printf("%s%c",A[v[i]].s,i+1==v.size()? '\n':' ');
}
return 0;
}