更一道构造,构造做的稀巴烂,在考虑是不是要开个构造专题了
题目链接
给定数组 a a a,让你找到任意一个数组 b b b,使得 b b b满足, 1 < = b [ i ] < = 1 e 9 1<=b[i]<=1e9 1<=b[i]<=1e9,且 b b b数组相邻的元素之间可整除(不论谁是除数或被除数),且每一对应的 a [ i ] ? b [ i ] a[i]-b[i] a[i]?b[i]的绝对值的和小于等于 a a a数组的总和
相邻元素之间要能整除,我们容易就想构造全是 1 1 1的数组,这样必然无法满足小于总和的条件,于是我们让每两个 1 1 1之间加上一个不为 1 1 1的数,最佳的添加数为对应的 a [ i ] a[i] a[i],然后我们分别让奇数位的为 1 1 1,偶数位的为 1 1 1,易知必有一个满足条件,输出即可
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
int n;cin >> n;
vector<ll>a(n + 3);
ll sum1 = 0;ll sum2 = 0;
for (int i = 1;i <= n;i++) {
cin >> a[i];
if (i % 2)sum1 += a[i] - 1;//让奇数位变为1
else sum2 += a[i] - 1;
}
if (sum1 < sum2) {
for (int i = 1;i <= n;i++) {
if (i % 2)cout << 1 << ' ';
else cout << a[i] << ' ';
}
}
else {
for (int i = 1;i <= n;i++) {
if (i % 2)cout << a[i] << ' ';
else cout << 1 << ' ';
}
}
cout << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}