51nod 1596 搬货物 2的倍数的运算+优先队列处理

来源:互联网 发布:weblogic源码部署项目 编辑:程序博客网 时间:2024/06/03 17:29

现在有n个货物,第i个货物的重量是 2wi 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。

样例解释:

1,1,2作为一组。

3,3作为一组。


Input
单组测试数据。第一行有一个整数n (1≤n≤10^6),表示有几个货物。第二行有n个整数 w1,w2,...,wn,(0≤wi≤10^6)。
Output
输出最少的运货次数。
Input示例
样例输入151 1 2 3 3
Output示例
样例输出12
用优先队列做。
需要注意货物的重量是2的w次方。也就是说所有的货物都能单独搬运,最多就是搬n次。
只有两个货物的幂数相同的时候可以放在一起搬。幂运算的概念。如果可以一起搬,那么我们就把幂数+1的数在和之后的比较,看看还能不能一起搬。
对于数据 1 1 2 3 3 用优先队列处理。
首先拿出了1和1,相等,把他们两个取出,放入2.
对于 2 2 3 4 我们拿出 2 2,相等,取出后放入4.
对于 3 4 4 ,我们拿出3 4 ,不相等,说明3只能单独运,而4不确定。所以3取出,4不动。cnt=1;
对于4 4 , 我们拿出4 4 相等,放入8.
对于8,只有这一个了,我们单独一次cnt=2;
最后cnt就等于2.
#include<iostream>#include<stdio.h>#include<math.h>#include<vector>#include<queue>using namespace std;int main(){     ios::sync_with_stdio(false);    priority_queue<long long,vector<long long>,greater<long long> >q;    long long n,t;   cin>>n;    for(int i=0;i<n;i++)    {        cin>>t;        q.push(t);    }     long long cnt=0;    while(!q.empty())    {                 if(q.size()==1)        {            cnt++;            break;        }         long long t1=q.top();        q.pop();                long long t2=q.top();        if(t1==t2)        {            q.pop();            q.push(t1+1);        }        else        {            cnt++;        }    }   cout<<cnt<<endl;   // cout<<cnt<<endl;}
System Message (题目提供者)



原创粉丝点击