51nod 1596 搬货物 2的倍数的运算+优先队列处理
来源:互联网 发布:weblogic源码部署项目 编辑:程序博客网 时间:2024/06/03 17:29
现在有n个货物,第i个货物的重量是
样例解释:
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 (题目提供者)
阅读全文
0 0
- 51nod 1596 搬货物 2的倍数的运算+优先队列处理
- 51 nod 1596搬货物 (二进制进位或优先队列)
- 51NOD 1596 搬货物
- 51Nod-1596-搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51Nod 1596 搬货物
- 51nod-1596 搬货物
- 51Nod 1596 搬货物
- 51nod-1596 搬货物
- 51nod 1596 搬货物
- 51Nod 1596 搬货物
- 51nod 1596 搬货物
- 51Nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- 51nod 1596 搬货物
- vue脚手架使用及问题
- Windows线程池
- 作业6
- Java中的值传递与“引用传递”
- msys64+mingw环境搭建
- 51nod 1596 搬货物 2的倍数的运算+优先队列处理
- iPhone X适配 最简单粗暴的
- ubuntu下wps不能输入中文
- Unity 构建IOS和ANDROID工程 (二)
- 数据结构和算法学习02-时间复杂度和空间复杂度
- wordpress 处理 ajax 请求
- ssh远程登录方式
- Java字节码2-instrument初体验
- 程序员面试金典