求大佬们看看我的判断函数,感激不尽
查看原帖
求大佬们看看我的判断函数,感激不尽
1100140
Ryoo楼主2024/10/26 09:23
#include <bits/stdc++.h>
using namespace std;
int l,m,n, a[50005], cha[50005];	//cha数组表示每块石头间的间隔,cha[1]是第一块石头到起点间隔,cha[n+1]是最后一块石头和终点的间隔 
bool pd(int x) {
	long long num = x*(n-m+1);		//去除m块石头后间隔全部为二分值时的总长度 
	int mm = m;
	if(num > l) return false;		//如果num比起点到终点的长度大,则必定为非法解 
	else{
		//int chb[50005];
		//for(int i = 1; i <= n+1) {
		//	chb[i] = cha[i];
		//}
		int chb = cha[1];			//用于寻找比二分值小的间隔 
		for(int i = 1; i <= n+1; i++) {
			
			if(chb < x) {
				if(mm == 0) return false;	//当间隔小于二分值且前面已经移除了m块石块(不能再移除石块) 
				chb += cha[i+1];i++;mm--;	//加上右边的间隔,并使下一次循环i跳过右边间隔 
				if(chb >= x) chb = cha[i+1];//当间隔大于等于二分值时符合要求,将chb赋值为下一个间隔 
				
			}
			
		}
		return true;	 
	}
}
int main() {
	scanf("%d%d%d", &l, &n, &m);
	int ll = 1, r = l, mid = (ll+r+1)/2;
	for(int i = 1; i <= n+1; i++) {
		if(i == n+1) {
			cha[i] = l-a[i-1];continue;	//i = n+1时不进行输入 
		}
		scanf("%d", &a[i]);
		if(i == 1) cha[i] = a[i];
		else if(i <= n) cha[i] = a[i]-a[i-1];
	}
	
//	for(int i = 1; i <= 20; i++) printf("%d ", cha[i]);
	
	while(ll < r) {
		if(pd(mid)) {ll = mid;mid = (ll+r+1)/2;}
		else {r = mid-1; mid = (ll+r+1)/2;}
	}
	printf("%d", ll);
	
	return 0;
}
2024/10/26 09:23
加载中...