问题描述
小T到CZ中学上的第一堂课是物理课,第一堂课L老师就把大家带到创新实验室去做实验了,实验的内容是天平称物。众所周知天平是物理实验室中的一种衡量物体质量的仪器,它依据杠杆原理制成,在杠杆的两端各有一个小盘,一端放砝码,另一端放要称的物体,杠杆中央装有指针,两端平衡时,意味着两端的质量相等。这些道理对学过初中物理的人来说已经是老生常谈了,小T原以为这次实验跟初二做过的不会有太大区别,但当他一走进创新实验室,就立即被眼前堆得跟小山一样的砝码震住了,小T走上前去拿出几个砝码看了一下,发现所有砝码上标明的质量均为 22 的幂次:1g,2g,4g,8g,16g,32g1g,2g,4g,8g,16g,32g 等等,这下小T彻底被雷到了,心想这是物理实验室吗?怎么跟计算机中的二进制表示那么相似呢? 正当小T想得出神,L老师已经在大声催促同学们座到指定位置上去做实验了,小T和同桌小S两人一组很快就把桌上几个物体的质量用天平称出来了,抬头一看周围的同学还都在忙碌着,小T就对小S说:“我们来做个游戏好不好?”小S说:“做什么游戏?” 小T说:“很简单,我随意抓一把些砝码放到天平的左端,你要在天平的右端放置最少数量的砝码使得天平平衡。”小S说:“没问题,那我们就开始吧!”游戏开始后,小S发现当小T放上去的砝码个数较多且相同质量的砝码有多个时有点难办,于是他就找到了会编程的你,希望你帮他处理这个问题。
输入格式
输入数据共有两行,第一行包含一个正整数 NN,表示小T一共抓了 NN 个砝码放到了天平的左端,第二行有 NN 个用空格隔开的正整数 表示每个砝码的质量,每个砝码的质量都是 22 的幂次,即等于若干个 22 连乘的积,如 88 等于 33 个 22 连乘的积,6464 等于 66 个 22 连乘的积,10241024 等于 1010 个 22 连乘的积等等,特别地我们规定 11 也是 22 的幂次。
输出格式
输出数据仅有一行包含一个正整数表示小S最少要在天平的右端放置几个砝码,CZ中学的物理创新实验室里只有质量为 22 的幂次的砝码,并且每种砝码都取之不尽用之不竭。
输入数据 1
2
8 8
输出数据 1
1
输入数据 2
6
1 1 1 4 1 1
输出数据 2
2
数据范围
30%30% 的数据满足:N≤10N≤10,天平左端的 NN 个砝码的总质量不超过100g100g
60%60% 的数据满足:N≤100N≤100,天平左端的 NN 个砝码的总质量不超过10000g10000g
100%100% 的数据满足:N≤10000N≤10000,天平左端的 NN 个砝码的总质量不超过 2000000000g2000000000g
题解
#include<bits/stdc++.h>
using namespace std;
int n,sum,ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
while(n--){
int x;
cin>>x;
sum+=x;
}
for(int i=0;i<=int(log2(sum));i++){
if(sum&(1<<i))ans++;
}
cout<<ans<<endl;
return 0;
}