【51nod1563】坐标轴上的最大团 贪心

题面

坐标轴上有n个点,每个点有一个权值。第i个点的坐标是 xi ,权值是 wi 。现在对这些点建图。对于点对 (i,j) ,如果 (|xi−xj|≥wi+wj) ,那么就给第i个点和第j个点之间连一条边。
问建好的图中最大团有几个点。
(1≤n≤200000)

100

(|xi−xj|≥wi+wj),我们知道可以把每个点,看做一条([x_i-w_i,x_i+w_i])的线段。
那么就变成了找出最多条互不相交的线段。
那么就可以把线段按右端点排序后,贪心一波就好了。

Code

#include<bits/stdc++.h>
#define fo(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int inf=0x7fffffff;
const int maxn=200007;
int n;
pair<int,int> a[maxn];
int main(){
	scanf("%d",&n);
	fo(i,1,n){
		int j,k;
		scanf("%d%d",&j,&k);
		a[i]=make_pair(j+k,j-k);
	}
	sort(a+1,a+1+n);
	int ans=0,j=-inf;
	fo(i,1,n)
		if (a[i].second>=j){
			j=a[i].first;
			ans++;
		}
	printf("%d",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/hiweibolu/p/6754260.html