Educational Codeforces Round 158 (Rated for Div. 2)(A-C)

302 阅读2分钟

昨天的div2div2,只能补到CCDD没有精力了。

Problem - A - Codeforces

Problem - B - Codeforces

Problem - C - Codeforces

这次总体属于正常发挥,赛场上开出了ABAB,但是BB是猜的,不懂。。。

AA:送分题,但是我还WA1WA1了一次,大概思路就是扫一遍差值,最后一个差值要2*2,然后找出最大值即可。

BB:说实话我也不知道咋过的,就模拟了几个样例,发现了一个规律,如果a[i]a[i1]a[i]≤a[i-1],那么就不用管,否则就要+(a[i]a[i1]1)+(a[i]-a[i-1]-1)。然后最后++一个a[1]1a[1]-1就没了。

CC:赛后问的bcjjjbcjjj,就是考虑最多只需要3131次就可以把所有数变成相等,因为最大就是2312^{31},然后我们每次操作时候维护一下序列的最大值和最小值,如果某次序列的最大值与最小值相等,那么显然可以出循环,否则,如果最大值是奇数,那么所有数+1+1即可,否则就选00,毕竟我们每次操作的目标其实就是缩短最大值与最小值的差距。

代码

AA:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[1010];
void solve(){
	cin>>n>>l;
	int maxn=0;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	a[n+1]=l;
//	if(n==1){
//		cout<<l<<endl;
//		return;
//	}
	maxn=a[1];
	for(int i=2;i<=n+1;i++){
		//cin>>a[i];
		if(i!=n+1) maxn=max(maxn,a[i]-a[i-1]);
		else maxn=max(maxn,2*(a[i]-a[i-1]));
	}
	cout<<maxn<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

BB:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[201000];
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	ll ans=a[1]-1;
	for(int i=2;i<=n;i++){
		if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
	}
	
	cout<<ans<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

CC:

#include <bits/stdc++.h>

#define ll long long
#define x first
#define y second

#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std;
int t,n,l;
int a[201000];
vector<int> v; 
void solve(){
	cin>>n;
	v.clear();
	int cnt=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=31;i++){
		int maxn=a[1],minn=a[1];
		for(int j=1;j<=n;j++){
			minn=min(minn,a[j]);
			maxn=max(maxn,a[j]);
		}
		if(maxn==minn){
			cnt=i;
			break;
		}
		
		if(maxn%2==0) v.push_back(1);
		else v.push_back(0);
		for(int j=1;j<=n;j++){
			a[j]=(a[j]+v[v.size()-1])/2;
		}
	}
	cout<<cnt-1<<"\n";
//	cout<<cnt-1<<"n";
	if(cnt-1<=n && cnt-1>0){
		for(int i=0;i<v.size();i++){
			cout<<v[i]<<" ";
		}
		cout<<"\n";
	}
	
//	cout<<ans<<"\n";
}
int main(){
	IOS;
	cin>>t;
	while(t--) solve();
	return 0;
} 

再接再厉,不要放弃,一定能实现梦想!