51nod 1596 搬货物 2的倍数的运算+优先队列处理
2017-11-08 18:13
274 查看
现在有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示例
样例输入1 5 1 1 2 3 3Output示例
样例输出1 2
用优先队列做。
需要注意货物的重量是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 (题目提供者)
相关文章推荐
- 51NOD - 1596 搬货物 | CF587 A. Duff and Weight Lifting【思维+二进制】
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod-1596-搬货物
- 51nod 1596 搬货物 思路题
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51Nod 1596 搬货物 二进制
- 51nod 1596 搬货物
- 【51nod 1596 搬货物】+ dp
- 51Nod 1596 搬货物
- 51Nod 1596 搬货物
- 51nod-1596 搬货物
- 51nod 1596 搬货物
- 51nod-1596 搬货物
- 51Nod-1596 搬货物
- 51Nod 1596 搬货物