Divisibility by 2^n

题意:

给你一个n以及n位数组,要求他们的乘积%(2^n) == 0;

不足的可以让第i位的数乘以i;

        满足:输出最少次数;

        否则:输出-1;

思路:

根据数组中的数,求出每个可以整除几次2,加到sum中;

(sum就是当前二的几次方)

cin >> m;
while (m && m % 2 == 0) {
    m /= 2;
    sum++;
}

对于第i位,计算i可以整除几次2,放入优先队列中;

int j = i;
while (j && j % 2 == 0) {
      j /= 2;
      p ++;
}
if(p)q.push(p);

最后,sum<n 并且队列不为空时,sum一直加队头元素;

若队列空并且sum仍小于n输出-1;

int ans = 0 ;
while(sum < n && !q.empty()){
      ans ++;
      sum += q.top();
      q.pop();
}

总代码:

#include<bits/stdc++.h>
using namespace std;
int n , m , T;
int main(){
    cin >> T;
    while(T --) {
        priority_queue<int, vector<int>, less<int> > q;
        memset(vis, 0, sizeof vis);
        cin >> n;
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            cin >> m;
            while (m && m % 2 == 0) {
                m /= 2;
                sum++;
            }
            int p = 0;
            int j = i;
            while (j && j % 2 == 0) {
                j /= 2;
                p++;
            }
            if(p)q.push(p);
        }
        int ans = 0 ;
        while(sum < n && !q.empty()){
            ans ++;
            sum += q.top();
            q.pop();
        }
        sum >= n ? cout << ans : cout << -1 ;
        cout << endl;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值