链接:https://codeforces.com/problemset/problem/1463/B
题意:给定一个序列,让构造出一组数列,满足两倍的所有差值的绝对值之和满足<=所有数的和,其中每个数都不能超过1e9,并且相邻两个数不能为互相的倍数。
思路:
构造一个为2的等比数列就行了,对于每一位找到不超过它的最大的等比数就可,哎,我之前想过取平均数的做法或者枚举等比因子,其实快想到了,但还是不信。。证明一下 ,假设每个数为k,那么得到的等比数一定>=k/2,所以加起来一定<=sum/2
代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int a[55];
long long res[55];
int Log(int x)
{
    int res=0;
    while(x!=1)
    {
        x/=2;
        res++;
    }
    return res;
}
signed  main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        long long sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            int t1=Log(a[i]);
            int t2=t1+1;
            //cout<<t1<<" "<<t2<<endl;

            if(abs((1ll<<t2)-a[i])<abs((1ll<<t1)-a[i]) && (1ll<<t2)<1e9)
                cout<<(1ll<<t2)<<" ";
            else
                cout<<(1ll<<t1)<<" ";
        }
        cout<<endl;

    }
    return 0;
}