题意:
给你一个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;
}
}