51nod 1596 搬货物【贪心/二进制】
现在有n个货物,第i个货物的重量是 2wi 。每次搬的时候要求货物重量的总和是一个2的幂。问最少要搬几次能把所有的货物搬完。
样例解释:
1,1,2作为一组。
3,3作为一组。
单组测试数据。
第一行有一个整数n (1≤n≤10^6),表示有几个货物。
第二行有n个整数 w1,w2,...,wn,(0≤wi≤10^6)。
输出最少的运货次数。
样例输入1
5
1 1 2 3 3
样例输出1
2 【分析】:cf原题(http://codeforces.com/problemset/problem/587/A)讲解:https://segmentfault.com/a/1190000008232920
同类进制思维:Codeforces 552.C Vanya and Scales
我们从最简单的样例入手。
样例输入可以整理如下。x的后面表示这个数字的出现次数。
2^1 x22^2 x12^3 x2
我们发现,两个相同幂次的数,刚好能“等价变换”为更高次的数。
2^1 x2 => 2^2 x1
再加上已有的2^2,总共有2个2^2啦。于是,继续变换,
2^2 x2 => 2^3 x1
再加上已有的2个2^3,就有3个2^3啦。
2^3 x2+1
取出其中两个进行“变换”,最终结果就是
2^3 x12^4 x1
然后,我们发现不管怎么操作都无法进一步组合两个数进行变换。现在有两个数,所以答案是2。
做到这里,就不难看出其中的规律。二进制下的“进位”而已。
【代码】:
#include<bits/stdc++.h>
#define maxn 1000100
int w[maxn];
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(w,,sizeof(w));
while(n--)
{
scanf("%d",&i);
w[i]++;
}
int sum=;
for(int j=;j<maxn;++j)//进行二进制进位运算,当有一位为1时sum++,直至最后
{
if(w[j]>)//往上合并,否则就单独拿出来
{
w[j+]+=w[j]/;
w[j]%=;
}
if(w[j]==)
++sum;
}
printf("%d\n",sum);
}
return ;
}
51nod 1596 搬货物【贪心/二进制】的更多相关文章
- 51Nod 1596 搬货物
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1596 思路: 模拟二进制的进位. 这题很坑啊...用c++会超时,用c就 ...
- 51nod 1596 搬货物(二进制处理)
传送门 题意 分析 只要从小到大二进制处理即可 我一直遍历了1->n,应该是0->1e6+1000 果然智障 trick 代码 #include<cstdio> #includ ...
- CodeForces 485C Bits[贪心 二进制]
C. Bits time limit per test1 second memory limit per test256 megabytes inputstandard input outputsta ...
- 【51nod-1596】搬货物
现在有n个货物,第i个货物的重量是 2wi .每次搬的时候要求货物重量的总和是一个2的幂.问最少要搬几次能把所有的货物搬完. 样例解释: 1,1,2作为一组. 3,3作为一组. Input 单组测试数 ...
- BZOJ3668: [Noi2014]起床困难综合症(贪心 二进制)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2708 Solved: 1576[Submit][Status][Discuss] Descript ...
- 51nod1596 搬货物
现在有n个货物,第i个货物的重量是 2wi .每次搬的时候要求货物重量的总和是一个2的幂.问最少要搬几次能把所有的货物搬完. 样例解释: 1,1,2作为一组. 3,3作为一组. Input 单组测试数 ...
- 51nod 1086 背包问题 V2(二进制优化多重背包)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 题解:怎么用二进制优化多重背包,举一个例子就明白了. ...
- 51Nod 1344 走格子 | 贪心
Input示例 5 1 -2 -1 3 4 Output示例 2 贪心 #include <bits/stdc++.h> using namespace std; typedef long ...
- 51Nod 1091 线段重叠 | 贪心
Input示例 5 1 5 2 4 2 8 3 7 7 9 Output示例 4 first try: O(n^2):二层循环,减法取最大 后五个time limit exceeded #includ ...
随机推荐
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目3
2014-04-23 18:10 题目:设计一个点唱机. 解法:英文叫Musical Jukebox.这是点唱机么?卡拉OK么?这种题目实在是云里雾里,又没有交流的余地,我索性用一个vector来表示 ...
- Python第三方模块tesserocr安装
介绍 在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是图形验证码,这时候我们可以直接用 OCR 来识别. tesserocr 是 Python 的一个 OCR 识别库 ,但其实是对 tes ...
- JFinal Template Engine 使用
官方文档:JFinal Template Engine 文档
- Python 3基础教程11-如何利用pip命令安装包和模块
本文介绍如何利用pip命令安装Python相关的包和模块.在Python中有些方法或者模块是自带的功能,也叫(build-in),内构函数,实际使用,可能内构函数或者模块不能完成我们的任务,我们就需要 ...
- Canvas 给图形绘制阴影
/** * 图形绘制阴影 */ function initDemo6() { var canvas = document.getElementById("demo6"); if ( ...
- python 学习分享-rabbitmq
一.RabbitMQ 消息队列介绍 RabbitMQ也是消息队列,那RabbitMQ和之前python的Queue有什么区别么? py 消息队列: 线程 queue(同一进程下线程之间进行交互) 进程 ...
- JS 如何获取radio或者checkbox选中后的值
废话不多说,直接上代码: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...
- Linux中awk后面的RS, ORS, FS, OFS 含义
转载自http://blog.csdn.net/qq416647781/article/details/40649419 一.RS 与 ORS 差在哪 我们经常会说,awk是基于行列操作文本的 ...
- WinDbg分析dump文件排查bug
文章:WinDbg-如何抓取dump文件 命令: cd C:\Windows\System32\inetsrv appcmd list wp 可以查看各个站点的pid