T145305 【2020.8.24NOIP模拟赛】选数排列

T145305 【2020.8.24NOIP模拟赛】选数排列_第1张图片

思路:

我们看到最大值的最小值,考虑用二分
枚举可能达到的F值,然后判断
怎样判断呢
我们考虑当行中最大值-最小值大于二分答案时,我们就多枚举一行来记录
最后只要判断下行数有没有大于r就行了

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

int n, r, c;
int a[10010000];

bool check(int maxx)
{
     
	int f[10010000];
	for(int i=0; i<c; i++) f[i]=0;
	for(int i=c; i<=n; i++)
	{
     
		f[i]=f[i-1];
		if(a[i]-a[i-c+1]<=maxx)
			f[i]=f[i-c]+1;
	}
	if(f[n]>=r)
		return 1;
	else return 0;
}
int main(){
     
	scanf("%d%d%d", &n, &r, &c);
	for(int i=1; i<=n; i++)
		scanf("%d", &a[i]);
	sort(a+1, a+1+n);
	int l=0, r=a[n]-a[1];
	while(l<r)
	{
     
		int mid=l+r>>1;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	printf("%d", l);
	return 0;
}

你可能感兴趣的:(题解,二分,DP)