区间选点问题

本文介绍了一种通过排序解决区间覆盖问题的方法。首先按照区间的右端点进行升序排列,若右端点相同则按左端点降序排列。通过这种方式确保了区间覆盖时能尽可能多地覆盖后续区间。该算法可用于解决一系列计算机科学中的覆盖问题。
 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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值