题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037
题 意:给你n个节目的开始时间与结束时间,问能看完几个节目。
思 路:直接贪心比较时间就行了,
排序时,有两种方式
1,按开始时间排序
0 1 2 3 3 4 5 6 8 10 15 15
2,按结束时间排序
1
代码如下:
方式1的代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
struct node
{
int r,l;
} vis[120];
bool cmp( node a, node b )
{
if(a.l != b.l ) return a.l < b.l;
return a.r < b.r;
}
int main()
{
int n;
while( scanf ( "%d", &n ) != EOF )
{
if( n == 0 ) break;
for( int i = 0; i < n; i ++ )
scanf ( "%d %d", &vis[i].l, &vis[i].r );
sort(vis, vis+n,cmp);
vis[n].r=vis[n].l=200;
int ans = 0;
for( int i = 0; i < n; i ++ )
{
if( vis[i].r <= vis[i+1].r )
{
int j = i+1;
while(vis[i].r > vis[j].l )
j++;
if(vis[i].r < vis[j].l)
i=j,ans++;
else
if(vis[i].r == vis[j].l)
i=j-1,ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
方式2的代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
struct node
{
int r,l;
} vis[120];
bool cmp( node a, node b )
{
return a.r < b.r;
}
int main()
{
int n;
while( scanf ( "%d", &n ) != EOF )
{
if(n==0) break;
for( int i = 0; i < n; i ++ )
scanf ( "%d %d", &vis[i].l, &vis[i].r );
sort(vis, vis+n,cmp);
vis[n].r=vis[n].l=200;
int ans = 1,temp = vis[0].r;
for( int i = 1; i < n; i ++ )
{
if(vis[i].l >= temp ) ans++,temp=vis[i].r;
}
printf("%d\n",ans);
}
return 0;
}