Educational Round 64 C. Match Points(二分,贪心)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Round 64 C. Match Points(二分,贪心)相关的知识,希望对你有一定的参考价值。

Link

贪心,但不是无脑贪心.

一开始想的是,从小到大对于每个数 x x x找到第一个大于等于 x + z x+z x+z且没有被用过的数字让他们匹配

因为这样可以让后续的数字尽可能大

但是这样一来,剩下的数字都很大,然而差值却非常小,比 z z z还小,反而不能匹配,所以这个贪心是错的…


先对数组 a a a排序

考虑二分答案 k k k,那么选出最小的 k k k个数和最大的 k k k个数来匹配一定是最优的

我们让 a i a_i ai a n − i + 1 a_{n-i+1} ani+1匹配,如果这都不行那就没办法了,时间复杂度 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))

#include <bits/stdc++.h>
using namespace std; 
const int maxn =3e5+10;
int n,z,a[maxn];
bool isok(int k)
{
	for(int i=1,j=n-k+1;i<=k;i++,j++)
		if( a[j]-a[i]<z )	return false;
	return true;
}
signed main()
{
	cin >> n >> z;
	for(int i=1;i<=n;i++)	cin >> a[i];
	sort(a+1,a+n+1);
	int l = 1, r = n/2, ans = 0;
	while( r>=l )
	{
		int mid = l+r>>1;
		if( isok(mid) )	l = mid+1, ans = mid;
		else	r = mid-1;
	}
	cout << ans;
	return 0;
}

以上是关于Educational Round 64 C. Match Points(二分,贪心)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 80 C. Two Arrays

Educational Codeforces Round 109 (Rated for Div. 2)C. Robot Collisions D. Armchairs题解

Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)

Educational Codeforces Round 84 (Rated for Div. 2) C. Game with Chips(思维题)

[Educational Codeforces Round 55 (Rated for Div. 2)][C. Multi-Subject Competition][时间复杂度]

Educational Codeforces Round 109 (Rated for Div. 2) C. Robot Collisions (栈,模拟)