Educational Codeforces Round 158 (Rated for Div. 2)

发布时间 2023-11-25 15:48:55作者: yufan1102

A. Line Trip

题意是:有n个加油点,人要来回两趟,问你最少要多少油?

using namespace std;
int a[100];
void solve(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	int ans=a[1];
	for(int i=2;i<=n;i++){
		ans=max(ans,a[i]-a[i-1]);
	}
	ans=max(ans,2*(m-a[n]));
    cout<<ans<<"\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

B. Chip and Ribbon

题意是:从点一出发,按顺序对每个位置+1,或者你可以跳跃,目的是让每个位置的值等于给的值,问你最少要跳跃多少次?

#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
void solve(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(a[i]>a[i-1]){
			ans+=a[i]-a[i-1];
		}
	}
	cout<<ans-1<<"\n"; 
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

C. Add, Divide and Floor

题意是:每次操作是选一个x,然后对每个数组中的每个数加上x然后除以2,问你最少要进行多少次操作,时数组中的数相等,如果操作数小于等于数组长度,打印出每次操作的x

思路:猜想是,要是数组的所有数相等,那么是最大的和最小的相等,中间的一定相等,而且加上的x的大小其实并不影响操作数的大小,所以这里x只取1,0。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
void solve(){
	int n;
	cin>>n;
	int mx=0;
	int mi=1e9;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mx=max(mx,a[i]);
		mi=min(mi,a[i]);
	}
	vector<int>ans;
	while(mi!=mx){
		if(mi%2==mx%2){
			ans.push_back(0);
		}else if(mx%2==0){
			ans.push_back(1);
			mx++;
			mi++;
		}else{
			ans.push_back(0);
		}
		mi/=2;
		mx/=2;
	}
	cout<<ans.size()<<"\n";
	if(ans.size()==0)return;
	if(ans.size()<=n){
		for(auto c:ans){
			cout<<c<<" ";
		}
	}
    cout<<"\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
}