C题——东二(二进制相关,log2,优先队列)

[Gym - 101911C]

题目:

C题——东二(二进制相关,log2,优先队列)
C题——东二(二进制相关,log2,优先队列)
C题——东二(二进制相关,log2,优先队列)
C题——东二(二进制相关,log2,优先队列)

中文意:

最近,Monocarp公司创建了自己的迷你实验室!这个实验室含有n细菌。Monocarp知道,他可以合并任何两个细菌具有相同的大小,由此产生的细菌的大小将等于合并细菌的大小之和。例如,如果两个大小等于7的细菌合并,结果是一个大小为14的细菌。很难观察到很多细菌,所以Monocarp想把它们合并成一种细菌。可能这是不可能做到的,所以他可以购买任何数量的任何可能的整数大小的细菌在一个特殊的商店。你必须确定最小数量的细菌,Monocarp必须购买相应数量相应种类的细菌以合并他们,最终合成一种细菌。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<math.h>
#define ll long long
using namespace std;
int aa[200005];
priority_queue <ll ,vector<ll> , greater<ll> >q;
int main()
{
    int n;
    scanf("%d",&n);
     while(!q.empty()) q.pop();
    for(int i=0;i<n;i++) scanf("%d",&aa[i]),q.push(aa[i]);

    bool tmp=false;
    ll ans=0;
    while(q.size()>=2)
    {
        ll kx=q.top();
        q.pop();
        ll ky=q.top();
        q.pop();
        ll k=ky/kx;
        if(ky%kx!=0||k&(k-1)!=0)///一个数是2的倍数,则k&(k-1)=0
        ///比如k = 10000(2),则k-1=01111(2),其没有与集
        {tmp=true ;break;}
        else
        {
            //cout<<"aaaa"<<endl;
            q.push(ky*2);
            ans+=log2(k*1.00);///log2函数
            //cout<<ans<<"---";
        }
    }
    if(tmp)cout<<"-1"<<endl;
    else
    {
     cout<<ans<<endl;
    }

}
上一篇:CF1088F Ehab and a weird weight formula【倍增】


下一篇:Pytorch实战使用ResNet50/101/152实现Cifar-10的分类任务