51Nod - 1596 搬货物

51Nod - 1596 搬货物

现在有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 3

Output示例

样例输出1
2

题解:

  类似二进制的思路。

  极端数据还真的很烦。 (MAXN 需要超过 1e6 + 115,  设 1e6+5 是不行的)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 1000000 + 115;
int n, num[MAXN]; 

int main(){
	int a, ans, max_val;
	while(scanf("%d", &n) != EOF){
		memset(num, 0, sizeof(num));
		max_val = 0;
		for(int i=0; i<n; ++i){
			scanf("%d", &a);
			num[a] = num[a] + 1;
			if(max_val < a){
				max_val = a;
			}
		}
		ans = 0;
		for(int i=0; i<=max_val+100 && i<MAXN; ++i){
			if(num[i] > 1){
				num[i+1] = num[i+1] +  (num[i]/2);
				num[i] = num[i] % 2;
			}
			if(num[i] == 1){
				ans++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

  

或者是:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 1000000 + 115; 

int n, num[MAXN]; 

int main(){
	int a, ans;
	while(scanf("%d", &n) != EOF){
		memset(num, 0, sizeof(num));
		for(int i=0; i<n; ++i){
			scanf("%d", &a);
			num[a] += 1;
			while(num[a] >= 2){
				num[a] -= 2;
				a = a + 1;
				num[a] += 1;
			}
		}
		ans = 0;
		for(int i=0; i<MAXN; ++i){
			if(num[i]){
				ans++;
			}
		}
		printf("%d\n", ans );
	}
	return 0;
}

  

时间: 2024-10-14 11:18:47

51Nod - 1596 搬货物的相关文章

1596 搬货物

现在有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 3 Output示例 样例输出1 2 进行二进制进位运算,当有一位为1时sum+

51nod———货物运输 解题报告

公元2222年,l国发生了一场战争. 小Y负责领导工人运输物资. 其中有m种物资的运输方案,每种运输方案形如li,ri.表示存在一种货物从li运到ri. 这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间. 由于高科技的存在,小Y想到了一种节省时间的好方案.在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间. 但是为了防

货物运输 51Nod - 1671

公元2222年,l国发生了一场战争. 小Y负责领导工人运输物资. 其中有m种物资的运输方案,每种运输方案形如li,ri.表示存在一种货物从li运到ri. 这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间. 由于高科技的存在,小Y想到了一种节省时间的好方案.在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间. 但是为了防

洛谷 1126 机器人搬重物

1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动1步(Creep):向前移动2步(Walk):向前移动3步(Run):向左转(Left):向右转(Right).每个指令所需要的时间为1秒.请你计算一下机器人完成任务所需

随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率,想象为一个n维长方体,有两个平面与这个几何图形相割,于是就变成了求面(体)积问题,一般要去重,n维区域系数:s^n/n!,至于区间问题,直接前缀之差搞定 然后就是悲催的算法马拉松17F题了...其实是道好题来的,只是出题人不知世界上还有这题,然后某大牛把思路理清后把答案直接搬了过来 经典的1*2骨牌覆

洛谷OJ P1126 机器人搬重物 解题报告

洛谷OJ P1126 机器人搬重物 解题报告 by MedalPluS [题目描述]    机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动1步(Creep):向前移动2步(Walk):向前移动3步(Run):向左转(Left):向右转(Right).

机器人搬重物

机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:先前移动1步(Creep):向前移动2步(Walk):向前移动3步(Run):向左转(Left):向右转(Right).每个指令所需要的时间为1秒.请你计算一下机器人完成任务所需的最少时间

51nod百度之星2016练习赛

今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min(ri)],那么我们考虑枚举min(ri),将ri>=min(ri)的区间按顺序加入,这时我们显然应该选第k小的li来更新答案.这些操作用个堆就可以轻松维护了. 时间复杂度为O(NlogN). #include<cstdio> #include<cctype> #include<queue> #inc

CSU-1975 机器人搬重物(BFS)

1975: 机器人搬重物 Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 64     Solved: 10 Description 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动1