题目大意:给定一个长度为n的数组a要求构造一个长度为n的数组b,满足:
1. 1 ≤ b i ≤ 1 0 9 , 1 ≤ i ≤ n 1 \leq b_i \leq 10^9,1\leq i \leq n 1≤bi≤109,1≤i≤n
2. b i % b i + 1 = 0 b_i \% b_{i+1}=0 bi%bi+1=0 or b i + 1 % b i = 0 b_{i+1} \%b_i=0 bi+1%bi=0
3.
2
∑
i
=
1
n
∣
a
i
−
b
i
∣
≤
∑
i
=
1
n
a
i
2\sum_{i=1}^n\ \vert a_i-b_i \vert \leq \sum_{i=1}^na_i
2∑i=1n ∣ai−bi∣≤∑i=1nai
1
≤
T
≤
1000
,
1
≤
a
i
≤
1
0
9
,
1
≤
n
≤
50
1 \leq T \leq 1000,1 \leq a_i \leq 10^9,1 \leq n \leq 50
1≤T≤1000,1≤ai≤109,1≤n≤50
题解:
对于条件三我们可以考虑使得每一项都满足,即
∣
a
i
−
b
i
∣
≤
a
i
2
,
1
≤
i
≤
n
\vert a_i-b_i \vert \leq \frac{a_i}{2},1 \leq i \leq n
∣ai−bi∣≤2ai,1≤i≤n
于是可以构造
b
i
b_i
bi为小于等于
a
i
a_i
ai的最大的2的次幂
这样的话就一定满足上式,从而满足条件三。
证明:
设
b
i
=
2
k
,
2
k
≤
a
i
<
2
k
+
1
b_i=2^k,2^k \leq a_i <2^{k+1}
bi=2k,2k≤ai<2k+1
∣
a
i
−
b
i
∣
=
a
i
−
2
k
\vert a_i-b_i \vert = a_i-2^k
∣ai−bi∣=ai−2k
a i < 2 k + 1 ⟺ a i 2 < 2 k ⟺ a i − 2 k < a i 2 a_i < 2^{k+1} \iff \frac{a_i}{2}<2^k \iff a_i-2^k <\frac{a_i}{2} ai<2k+1⟺2ai<2k⟺ai−2k<2ai
⟺ a i − b i < a i 2 \iff a_i-b_i<\frac{a_i}{2} ⟺ai−bi<2ai
证毕
又因为都是2的幂次所以一定满足条件二
所以该构造方法可行
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int t;
scanf("%d",&t);
printf("%d ",1<<(int)log2(t));
}
puts("");
}
return 0;
}