二分答案求hack/找错,悬关
查看原帖
二分答案求hack/找错,悬关
678087
fangzichang楼主2023/3/14 07:44

rt,照课上老师的讲法打的

const int N=2e6+10;
int n,a[N];
string s;
bool check(int x){
	int i=n,cnti=0,cntoi=0,res=0;
	while(i){
		if(a[i]==3&&cntoi){//J与可以匹配的OI匹配 
			cntoi--;
			res++;
		}
		else if(a[i]==2&&cnti){//O与可以匹配的I匹配 
			cnti--;
			cntoi++;
		}
		else if(a[i]==1){
			if(res+cntoi+cnti<x){//这三样的和表示“作为最后一个I的I的数量”,必须大于等于x
				//所以未达到时一定不满足,要尽力贪心选取 
				cnti++;
			}
			else{
				cntoi--;//I和可以匹配的OI匹配 
				res++;
			}
		}
		i--;
	}
	return res>=x;
}
int main(){
	cin>>n>>s;
	s='$'+s;
	for(int i=1;i<=n;i++){
		if(s[i]=='I'){
			a[i]=1;
		}
		else if(s[i]=='O'){
			a[i]=2;
		}
		else{
			a[i]=3;
		}
	}
	int l=0,r=n;//二分最终答案 
	while(l<=r){
		int mid=(l+r)>>1;//mid为最终有几个塔,事实上就是有多少I作为OI的I 
		if(check(mid)){
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	cout<<r<<endl;
    return 0;
}

2023/3/14 07:44
加载中...