CF1463B Find The Array题解

题目

https://codeforces.com/contest/1463/problem/B

思路

显然的, $ 1 $ 可以整除任何数。我们不妨令:

  • 令所有的奇数位 $ b_i = 1 $ ,令所有的偶数位 $ b_i = a_i $ 。

  • 令所有的偶数位 $ b_i = 1 $ ,令所有的奇数位 $ b_i = a_i $ 。

可以证明,这两种方法至少其中一个可以满足 $ \sum\limits_{i=1}^n |a_i-b_i| \leq S $ ,其中 $ S=\sum\limits_{i=1}^n a_i $

证明

不妨令

\[S_1 = \sum_{i=1}^n \mathbb{1}_{i \bmod 2 = 1} \cdot |a_i - 1| \]

以及:

\[S_2 = \sum_{i=1}^n \mathbb{1}_{i \bmod 2 = 0} \cdot |a_i - 1| \]

其中,$ \mathbb{1}_{i \bmod 2 = 1} $ 是指示函数,当 $ i $ 为奇数时取值为 1,否则为 0 ; $ S_2 $ 同理。

\[S_1+S_2=\sum_{i=1}^n \mathbb{1}_{i \bmod 2 = 1} \cdot |a_i - 1|+ \sum_{i=1}^n \mathbb{1}_{i \bmod 2 = 0} \cdot |a_i - 1| =\sum\limits_{i=1}^n|a_i-1| \]

又因为 $ a_i \geq 1 , i = {1,2,\ldots,n}$ 。有:

\[S_1+S_2=\sum\limits_{i=1}^n a_i-n=S-n \]

采取反证法,假设两种方法均不满足条件三,即:

\[S_1 ,S_2\geq \frac{S}{2}+1 \]

所以

\[S_1+S_2 \geq S+2 >S-n \]

出现矛盾,假设不成立,故至少其中之一满足条件三。

代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int maxn=2e5+10;
int n,ans1[maxn],ans2[maxn],a[maxn];

void solve()
{
	int sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(i&1)
		{
			ans1[i]=1;
			ans2[i]=a[i];
		}
		else 
		{
			ans1[i]=a[i];
			ans2[i]=1;
		}
	}
	int s1=0;
	int s2=0;
	for(int i=1;i<=n;i++)
	{
		s1+=abs(ans1[i]-a[i]);
		s2+=abs(ans2[i]-a[i]);
	}
	if(s1*2<=sum)
	{
		for(int i=1;i<=n;i++) cout<<ans1[i]<<' ';
		cout<<endl;
	}
	else
	{
		for(int i=1;i<=n;i++) cout<<ans2[i]<<' ';
		cout<<endl;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int t=1;
	cin>>t;
	while(t--)
	{
		solve();
	}
	
	
	
	
	return 0;
}
posted on 2025-05-16 00:25  Linear_L  阅读(19)  评论(0)    收藏  举报