Educational Codeforces Round 100 (Rated for Div. 2) B. Find The Array

该篇博客探讨了一种算法问题,即如何构造一个数组b,使得b数组相邻元素能相互整除,并且b数组与给定数组a的差值之和不超过a数组元素之和的一半。解决方案是将b数组的每个元素设置为a数组对应元素最近的2的幂次方。这种方法通过确保b数组元素不超过a[i],同时满足整除条件,实现了题目要求。

题意:
给出一个a数组,现在要构造一个b数组,使得b数组相邻两个元素其中一个能整除另一个,并且a数组与b数组之差的绝对值的和*2<=a数组元素之和。

题解:
思路一:
先给出结论:小于等于x并且离x最近的2的幂次方的范围是[x/2,x]。知道这个结论,很快就能知道,只要把b[i]=离a[i]最近的2的幂次方,就一定能满足条件。
结论的正确性可以用反证法来证明。

思路二:
我们假设b[i]<=a[i],由条件可以推出a[i]-b[i]<=a[i]/2,即2*b[i]>=a[i]。那么什么数可以保证相互整除,并且乘2还能大于a[i]?根据思路一,就是离a[i]最近的2的幂次方,但是考虑到a[i]<=1e9,b[i]<=1e9,我们只需选择小于等于a[i]的数即可。

代码:

#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=1e6+5;
const int mod=77797;
int a[MAXN];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            int s=log2(a[i]);
            int ans=pow(2,s);
            printf("%d ",ans);
        }
        printf("\n");
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值