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;
}
浙公网安备 33010602011771号