社区讨论

60分二分答案,求调,对拍不出错误

P4447[AHOI2018初中组] 分组参与者 1已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo1athdn
此快照首次捕获于
2023/10/22 18:00
2 年前
此快照最后确认于
2023/11/08 19:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int Inf=1e5+1; 
int n,a[Inf],m;
map<int,int>num;
bool check(int x){
//	int sum=1; 
	if(x==1)return 1;
	int use[Inf]={0};
	int nm[Inf];
	for(int i=1;i<=m;i++){
		nm[i]=num[a[i]];
	}
	
	for(int i=1;i<=m;i++){
		bool e=1;
		while(nm[i]){
			if(i+x-1<=m){
				for(int j=i+1;j<=i+x-1;j++){
					if(a[j]!=a[j-1]+1||nm[j]<=0){
						e=0;
						break;
					}
				}
			}
			else e=0;
			if(e){
				nm[i]--;
				for(int j=i+1;j<=i+x-1;j++){
					nm[j]--;
				}
				use[i+x-1]++;
			}
			else{
				if(use[i-1]>=nm[i]&&a[i-1]+1==a[i]){
//					int se=use[i-1];
					use[i]=nm[i];
					use[i-1]-=nm[i];
					nm[i]=0;
				}
				else return 0;
			}
		}
	}	
	return 1;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		if(num[x]){
			num[x]++;
		}
		else{
			num[x]=1;
			a[++m]=x;
		}
	} 
	sort(a+1,a+1+m);
	int l=0,r=m;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid)){
			l=mid+1;
		}
		else
		{
			r=mid;
		}
	} 
	if(check(r)==0)r--;
	printf("%d",r);
	return 0;
}
/*
input:11
-2 -1 0 1 1 1 2 2 3 4 5
output:2

input:9
1 1 2 2 3 3 3 4 5
output:3

7
8 7 9 3 0 8 1 
1
*/

回复

3 条回复,欢迎继续交流。

正在加载回复...