B-Find The Array
题目:
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.
Examples
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
思路:
若bi=1,那么bi+1可以取任意数(>=1&&<=1e9),可以发现当奇数位为1偶数为a[i],或者偶数为1奇数位为a[i],两者必然有一个是符合条件的。
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int b[10005];
int c[10005];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
long long int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
long long int ans=0,anss=0;
for(int i=1;i<=n;i++){
if(i%2==0){
b[i]=1;
ans+=fabs(a[i]-b[i]);
}
else
b[i]=a[i];
}
if(ans<=sum/2)
{
for(int i=1;i<=n;i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
else{
for(int j=1;j<=n;j++){
if(j%2!=0){
c[j]=1;
}
else
c[j]=a[j];
cout<<c[j]<<" ";
}
cout<<endl;
}
}
}