poj 1716 Integer Intervals

这个博客的第一个,是一个简单题。

http://poj.org/problem?id=1716

题意:找有最少的元素个数的集合使每个集合内都包括两点。

思路:贪心,首先按右顶点排序,每次找这个区间已经有多少个在集合内了,分为一个和两个或零个三种情况,然后分别判断;

View Code
 1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstdlib>
5 #include<cstring>
6 using namespace std;
7 int qq[10010];
8 struct node
9 {
10 int left,right;
11 }link[10010];
12 int cmp(const void *a,const void *b)
13 {
14 return (*(node *)a).right-(*(node *)b).right;
15 }
16 int main()
17 {
18 int n,i,count=0,p,j;
19 scanf("%d",&n);
20 for(i=1;i<=n;i++)
21 scanf("%d%d",&link[i].left,&link[i].right);
22 qsort(link+1,n,sizeof(link[0]),cmp);
23 memset(qq,0,sizeof(qq));
24 for(i=1;i<=n;i++)
25 {
26 p=0;
27 for(j=link[i].left;j<=link[i].right;j++)
28 if(qq[j])
29 p++;
30 if(p==0)
31 {
32 qq[link[i].right]=1;
33 qq[link[i].right-1]=1;
34 count+=2;
35 }
36 else
37 if(p==1)
38 {
39 qq[link[i].right]=1;
40 count++;
41 }
42 }
43 printf("%d\n",count);
44 return 0;
45 }



posted @ 2011-11-22 09:51  LT-blogs  阅读(118)  评论(0编辑  收藏  举报