题目链接:https://codeforc.es/contest/1463/problem/B
You are given an array [a1,a2,…,an] such that 1≤ai≤109. Let S be the sum of all elements of the array a.
Let’s call an array b of n integers beautiful if:
- 1≤bi≤109 for each i from 1 to n;
- for every pair of adjacent integers from the array (bi,bi+1), either bi divides bi+1, or bi+1 divides bi (or both);
- 2∑i=1n|ai−bi|≤S.
Your task is to find any beautiful array. It can be shown that at least one beautiful array always exists.
Input
The first line contains one integer t (1≤t≤1000) — the number of test cases.
Each test case consists of two lines. The first line contains one integer n (2≤n≤50).
The second line contains n integers a1,a2,…,an (1≤ai≤109).
Output
For each test case, print the beautiful array b1,b2,…,bn (1≤bi≤109) on a separate line. It can be shown that at least one beautiful array exists under these circumstances. If there are multiple answers, print any of them.
Example
input
4
5
1 2 3 4 5
2
4 6
2
1 1000000000
6
3 4 8 1 2 3
output
3 3 3 3 3
3 6
1 1000000000
4 4 8 1 3 3
分析
对于第二个要求,只要构造出1 x 1 x 1 x … 或者 x 1 x 1 x 1 … 这样的必然满足条件。
对于第三个要求,只要偶数位置的和和奇数位置的和我们取小的将他们变成 1 ,这样必然满足条件。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[57];
ll sum[2];
void solve()
{
sum[0] = sum[1] = 0;
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i % 2] += a[i];
}
if(sum[0] < sum[1])
{
for(int i=1;i<=n;i++)
if(i % 2 == 1) printf("%d ",a[i]);
else printf("1 ");
}
else
{
for(int i=1;i<=n;i++)
if(i % 2 == 0) printf("%d ",a[i]);
else printf("1 ");
}
printf("\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}