527D Clique Problem 判断一维线段没有两辆相交的最大线段数量

这题说的是给了n个位置 在x轴上 每个位置有一个权值为wi,然后将|xi - xj|>=wi+wj ,满足这个条件的点建一条边,计算着整张图中有多少多少个点构成的子图,使得这个子图的节点数尽量的大,这个式子进行转变 我们可以知道离i这个点为wi+xi xi-wi 范围内的点都是不可以的,那么我们就将这个n个点转化为了n条线段,那么现在的任务是计算这个n条线段两两不想交的 最大数量, 对于每条 线段有 左端点和右端点,我们将他们进行右端点排序, 然后进行每条边的判断前面k条线段的最右边那条是否与当先这条相交,如果相交,可以得知这条线段我们是不会使用的,因为我们有比他更加优的线段,在前面,如果不想交我们就把线段条数+1.记录当前最右的那条线段。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <cstdio>
 5 using namespace std;
 6 pair<int,int> P[200005];
 7 int main()
 8 {
 9     int n;
10     while(scanf("%d",&n)==1){
11          for(int i=0; i<n; i++){
12               int x,w;scanf("%d%d",&x,&w);
13               P[i] = {x+w,x-w};
14          }
15          sort(P,P+n);
16          int r = -2000000000;
17          int ans=0;
18          for(int i=0; i<n; i++){
19              if(P[i].second>=r){
20                  r = P[i].first; ans++;
21              }
22          }
23         printf("%d\n",ans);
24     }
25     return 0;
26 }

 

posted @ 2015-03-23 20:20  来自大山深处的菜鸟  阅读(167)  评论(0编辑  收藏  举报