区间选点问题

 1 /*

 2 先按右端点由小到大排序,相等的话左端点由大到小(否则会少算) 

 3 */

 4 #include <iostream>

 5 #include <cstdlib>

 6 #include <cstring>

 7 using namespace std;

 8 

 9 const int N = 10000;

10 /**下面的不会用 

11 typedef struct Node 

12 {

13     int a, b;

14     bool operator <  (const Node &node) const//此时使用sort排序 

15     {

16         return b<node.b || b==node.b&&a>node.a;

17     } 

18 };

19 Node q[N];

20 */

21 

22 typedef struct Node 

23 {

24     int a, b;

25 };

26 Node q[N];//不可直接把q[N]定义在typedef后边 

27 int cmp(const void *a, const void *b)

28 {

29     Node *c = (Node *)a;

30     Node *d = (Node *)b;

31     if(c->b == d->b)

32         return c->a < d->a;

33     return c->b > d->b;

34     

35 }

36 int cnt = 0;

37 

38 int main()

39 {

40     int i,j,k;

41     int T;

42     cin>>T;

43     int n;

44     while(T--)

45     {

46         memset(q,0,sizeof(q));

47         cin>>n;

48         for(i=0; i<n; i++)

49         {

50             cin>>q[i].a>>q[i].b;

51         }

52         qsort(q,n,sizeof(Node),cmp);

53         int end = -1;//坐标全是正数 

54         

55         for(i=0; i<n; i++)

56         {

57             if(end < q[i].a)

58             {

59                 end = q[i].b;

60                 cnt++;

61             }

62         }

63         cout<<cnt<<endl;

64     }

65     return 0;

66     

67 }

 

你可能感兴趣的:(问题)