Educational Codeforces Round 171 (Rated for Div. 2) B,C题解

B. Black Cells

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll lo=1e9+7,maxx=0,l,t,a[550000];
ll mod=1e9+7;
ll n,m,k,z,b[500050]={0};
ll c[100000],x,y;
int main(){
	cin>>t;
	while(t--){
	ll sum=1,ans=1e18+7,ro=1;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		b[i]=a[i]-a[i-1];每个数之间的距离
	}
	if(n%2!=0){//n=2时不用修改
	for(int i=0;i<n;i++){//枚举出去掉哪条边最优,从0开始方便
		if(i%2!=0){
			ro=max(ro,b[i]);//防止sum干扰
		}
		sum=ro;
		for(int j=i+2;j<n;j+=2){
			sum=max(sum,b[j]);	//去掉一个点后
		}
		ans=min(sum,ans);
	}
	 if(n==1){
		ans=1;
	}
	cout<<ans<<endl;
  }
  else{            //n=2时直接求最大
  	for(int i=1;i<n;i+=2){
  		sum=max(sum,b[i]);
	  }
	 cout<<sum<<endl;
  }
	
}
}

C. Action Figures

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t,k,ro=0;
ll a[500050],b[500500],c[500500];
char mp[5001][5005];
char mmp[5050][5050];
void inis(){
	for(int i=1;i<=400001;i++){
		b[i]=b[i-1]+i;
	}
}
int main(){
	cin>>t;
	inis();
	while(t--){
		cin>>n;
		string s;
		ll sum=b[n],ans=0;//ans即为未来,从后往前计算,sum为从1到n的和
		cin>>s;
		for(int i=n-1;i>=0;i--){
			if(s[i]=='1'&&ans<i){//每当为1时且未来能被透支时sum减去最i,并且透支未来即ans++
				sum-=(i+1);
				ans++;
			}
			else if(s[i]=='0'){//当为0时恢复ans即ans--但ans>0
				if(ans>0){
					ans--;
				}
			}
			else{   //如果未来不能被透支且为1,恢复即ans--;
				ans--;
			}
		}
		cout<<sum<<endl;
	}
}

 

posted @ 2024-10-29 18:43  薇尔莉特·伊芙加登  阅读(16)  评论(0)    收藏  举报