魔法药水
題目描述
小武的實驗室里有一種魔法藥水,這個藥水有個很奇怪的性質,它只能在盛放的體積為2的冪次時保 持穩定,例如1,2,4,8。所以小武在實驗室里放置了很多容積為2的冪次的瓶子,其中N瓶放有魔法藥 水,第i瓶魔法藥水的體積為2的L[i]次方。這天小武想要收拾一下實驗室,小武想知道最少用多少個瓶 子能把實驗室的藥水裝完。
 假設小武有任意2的冪次容積的瓶子,并且每種瓶子的數量足夠使用。
輸入格式
第一行一個正整數N
 第二行N個數,表示L[i]
輸出格式
一行一個數表示最少需要多少個瓶子
輸入輸出樣例
輸入 #1
5 1 1 2 3 3輸出 #1
2輸入 #2
6 7 6 4 6 7 0輸出 #2
4輸入 #3
7 8 6 6 8 2 8 4輸出 #3
5說明/提示
數據范圍
對于20%的數據,n<=10
 對于44%的數據,n<=100
 對于64%的數據,n<=10000
 對于76%的數據,n<=100000
 對于100%的數據,1<=n<=10610^6106,0<=L[i]<=10610^6106
樣例解釋
對于樣例1
 藥水體積依次為2,2,4,8,8,前3個可以裝入一個大小為8的瓶子,后2個可以裝入一個大小為16的瓶 子,最少需要2個瓶子
解題思路
由于2 ^ a + 2 ^ a = 2 ^ ( a + 1 )
 并且l[i]最大只有10^6
 暴力枚舉a,然后合并
Code
#include <iostream> #include <cstdio>using namespace std;const int maxn = 2000000; int n, ans, k; long long a[maxn], f[maxn + 100];int main(){scanf ("%d", &n);for (int i = 1; i <= n; i++){scanf ("%lld", &a[i]);f[a[i]]++;//記錄a}for (int i = 0; i < maxn; i++)//暴力枚舉a{f[i + 1] += f[i] / 2;//合并2 ^ ians += f[i] % 2;//合并不了,瓶子數 + 1} printf ("%lld", ans); }總結
                            
                        - 上一篇: 2783: 魔法药水【二分】
 - 下一篇: 解决苹果浏览器点击事件无法生效的问题