D. Clique Problem(排序贪心)

观察式子 x i x j > = w i + w j |x_i-x_j|>=w_i+w_j

由于对于两个点,总有一个大一点作为 i i ,一个小一点作为 j j

所以暂时去掉绝对值变成 x i w i > = x j + w j x_i-w_i>=x_j+w_j

也就是满足这个关系 i i j j 才有边

x i + w i 所以对于一个点x_i+w_i越小越好

x i + w i 所以按照x_i+w_i来排序

第一个必选

, x i + w i 后续能选就选,选了就更新x_i+w_i的值

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n;
struct p{
	int x,w,he,cha;
	bool operator < (const p&tmp )	const{
		if( he==tmp.he )	return cha<tmp.cha;
		return he<tmp.he;
	}
}a[maxn];
int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i].x >> a[i].w;
		a[i].he=a[i].x+a[i].w;
		a[i].cha=a[i].x-a[i].w;
	}
	sort(a+1,a+1+n);//x小的在前面
	p last=a[1];
	int ans=1;
	for(int i=2;i<=n;i++)
	{
		if( a[i].cha>=last.he )
		{
			ans++;
			last=a[i];	
		} 
	} 
	cout << ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107953969