A. Final Verdict

题意:

有一个长n的数组,你可将其拆为k份,但每份长度相等,且无交集,然后将数组元素更新为每份的平均值

能否在数组长度为一时,元素等于目标值x;

思路:

诈骗,无论你怎么拆,最后数组长度为一时,其值一定为原数组平均值;

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n,x;
	cin>>n>>x;
	vector<int>v(n);
	int sum=0;
	for(int i=0;i<n;i++){
		cin>>v[i];
		sum+=v[i];
	}
	if((sum/n)*n==sum&&sum/n==x){
		cout<<"YES"<<endl;
	}else{
		cout<<"NO"<<endl;
	}
	
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

B. Vicious Labyrinth

题意:

n个房间,每个房间距离出口n-i,每个房间都有一个人和一个传送器,每个传送器不能传送到它所在的房间,找一个传送器的配置,使每个房间的人经过k次传送后距离出口n最远

思路:

首先要理解,题中要求输出的是每个传送器能传送到达的房间位置,而非k次传送后的最终位置,

理解输出后,显然,当k为奇数时,除了n房间不能到达自身应为n-1外,其余房间传送器都应直接到达n房间(剩余k-1次传送为偶数,必能到达n),当k为偶数时,每个房间除了n-2房间不应到达自身应为n外,其余房间传送器都应直接到达n-1房间,(剩余k-1次传送为奇数,必能到达n)

当然,剩余k-1的传送次数在n和n-1房间循环

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		if(k&1){
			if(i==n){
				cout<<n-1<<' ';
			}else{
				cout<<n<<' ';
			}
		}else{
			if(i==n-1){
				cout<<n<<' ';
			}else{
				cout<<n-1<<' ';
			}
		}
	}
	cout<<endl;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

C. Breach of Faith

题意:

有一b数组,长2n,再找一元素构造一长度2n+1的a数组,满足无相同元素

且a1=a2−a3+a4−a5+…+a2n−a2n+1

思路:

看数据范围,暴力匹配o(c(n,2))会超时,我们只有o(n)的时间

再看一次数据范围,注意到bi的数据(1~1e9),ai的数据(1~1e18),若我们将未知数当作a1,情况非常复杂,所以我们将未知数设为x放在a2,将x变得非常大,至少大于b的每一个元素,

公式:a1=(x-?)+(?-?)…+(?-?);只要保证每一个“(?-?)”为负数且这些负数尽量小

例如1 3 4 6 7 9,(6-7+3-4)显然大于(4-7+3-6)即满足a[i]-a[n+i-1]

,就能使x最大,防止与b数组元素重复,然后输出即可

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
	int n;
	cin>>n;
	vector<int>v(2*n+1);
	int sum=0;
	for(int i=1;i<=2*n;i++){
		cin>>v[i];
	}
	sort(v.begin(),v.end());
	for(int i=2;i<2*n;i++){
		if(i<=n)sum+=v[i];
		else sum-=v[i];
	}
	int x=v[2*n]+v[1]-sum;
	cout<<v[2*n]<<' '<<x<<' '<<v[1]<<' ';
	for(int i=2;i<=n;i++){
		cout<<v[i]<<' '<<v[n+i-1]<<' ';
	}
	cout<<endl;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin>>t;
//	t=1;
	while(t--)solve();
	return 0;
}

Logo

集算法之大成!助力oier实现梦想!

更多推荐