码风优良,求hack
查看原帖
码风优良,求hack
602632
_7Mr楼主2024/1/7 14:51
#include<bits/stdc++.h>
#define int long long
#define double long double
#define INF INT_MAX
using namespace std;
const int maxn=3e5+5;
int n,cnt;
int a[maxn];
struct disease{int l,r,sum,ts;}p[maxn];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n;
	for(int i=1;i<=n;i++){
		char x;
		cin>>x;
		a[i]=x-'0';	
	}
	for(int i=0;i<=n;i++){
		if(a[i]==0 && a[i+1]==1) p[++cnt].l=i+1;
		else if(a[i]==1 && a[i+1]==0) p[cnt].r=i;
	}
	int o1,o2;
	o1=o2=0;
	for(int i=1;i<=cnt;i++) {
		if(p[i].l==1 && p[i].r==n){
			if(n%2) cout<<1<<endl;
			else cout<<2<<endl;
			return 0;
		}
		p[i].sum=p[i].r-p[i].l+1;
		p[i].ts=(p[i].sum+1)/2;
		o1+=p[i].ts;
		o2++;
	}
	int x=o1/o2;
	int ans=INF,zcans=0;
	for(int i=1;i<=cnt;i++){
		if(p[i].l==1){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].r==n){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].ts<x){
			zcans=INF;
			break;
		}
		zcans+=abs(p[i].ts-x)*2;
		if(p[i].sum%2==0) zcans+=2;
		else zcans++;
	}
	ans=min(ans,zcans);
	x++;
	zcans=0;
	for(int i=1;i<=cnt;i++){
		if(p[i].l==1){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].r==n){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].ts<x){
			zcans=INF;
			break;
		}
		zcans+=abs(p[i].ts-x)*2;
		if(p[i].sum%2==0) zcans+=2;
		else zcans++;
	}
	ans=min(ans,zcans);
	x-=2;
	zcans=0;
	for(int i=1;i<=cnt;i++){
		if(p[i].l==1){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].r==n){
			if(p[i].sum<x){
				zcans=INF;
				break;
			}
			if(x<=p[i].sum) zcans++;
			else zcans+=p[i].sum;
			continue;
		}
		if(p[i].ts<x){
			zcans=INF;
			break;
		}
		zcans+=abs(p[i].ts-x)*2;
		if(p[i].sum%2==0) zcans+=2;
		else zcans++;
	}
	ans=min(ans,zcans);
	if(ans==INF){
		ans=0;
		for(int i=1;i<=n;i++) ans+=a[i];
	}
	cout<<ans<<endl;
	return 0;
}
2024/1/7 14:51
加载中...