关于二分答案做法
查看原帖
关于二分答案做法
490694
Compound_Interest楼主2022/5/2 14:08
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
struct node{
	int last,len;
}b[maxn];
int a[maxn],n,cnt,ans;
bool check(int x){
	cnt=0;
	int now=0;
	for(int i=1;i<=n;i++){
		bool flag=0;
		now=0;
		for(int j=1;j<=cnt;j++)
			if(a[i]==b[j].last+1&&b[j].len<b[now].len){
				flag=1,now=j;
			}
		if(flag)
			b[now].last=a[i],b[now].len++;
		else{
			cnt++;
			b[cnt].len=1,b[cnt].last=a[i];
		}
	}
	for(int i=1;i<=cnt;i++)
		if(b[i].len<x)
			return false;
	return true;
}
int main(){
	b[0].len=0x3f3f3f3f;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+1+n);
	int l=1,r=n;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	printf("%d",ans);
	return 0;
}

这种做法如果输入一个公差大于等于2的等差数列每一次check都会被卡成n*n

求助有没有check是O(n) or O(nlogn)的二分答案做法

或者复杂度能过的其他二分答案做法

2022/5/2 14:08
加载中...