中石油训练赛十:天平
莫名感觉这道题和找零钱是一样一样的,便于记忆情况下,还是给写一下比较好
简单思路:贪心,要使右盘所放砝码最少,则要从较大质量的砝码开始放起。
题目描述
小 T 到 CZ 中学上的第一堂课是物理课,第一堂课 L 老师就把大家带到创新实验室去 做实验了,实验的内容是天平称物。众所周知天平是物理实验室中的一种衡量物体质量的 仪器,它依据杠杆原理制成,在杠杆的两端各有一个小盘,一端放砝码,另一端放要称的 物体,杠杆中央装有指针,两端平衡时,意味着两端的质量相等。这些道理对学过初中物 理的人来说已经是老生常谈了,小T原以为这次实验跟初二做过的不会有太大区别,但当 他一走进创新实验室,就立即被眼前堆得跟小山一样的砝码震住了,小T走上前去拿出几 个砝码看了一下,发现所有砝码上标明的质量均为 2 的幂次:1g,2g,4g,8g,16g,32g 等等, 这下小T彻底被雷到了,心想这是物理实验室吗?怎么跟计算机中的二进制表示那么相似 呢? 正当小 T 想得出神,L 老师已经在大声催促同学们座到指定位置上去做实验了,小 T 和同桌小S两人一组很快就把桌上几个物体的质量用天平称出来了,抬头一看周围的同学 还都在忙碌着,小 T 就对小 S 说:“我们来做个游戏好不好?”小 S 说:“做什么游戏?” 小T说:“很简单,我随意抓一把些砝码放到天平的左端,你要在天平的右端放置最少数 量的砝码使得天平平衡。”小 S 说:“没问题,那我们就开始吧!”游戏开始后,小S发现 当小T放上去的砝码个数较多且相同质量的砝码有多个时有点难办,于是他就找到了会编程的你,希望你帮他处理这个问题。
输入
输入数据共有两行,第一行包含一个正整数 N,表示小 T 一共抓了 N 个砝码放到了天 平的左端,
第二行有 N 个用空格隔开的正整数 表示每个砝码的质量,每个砝码的质量都是 2 的幂次,即等于若干个 2 连乘的积,如 8 等于 3 个 2 连乘的积,64 等于 6 个 2 连乘的积,1024 等于 10 个 2 连乘的积等等,特别地我们规定 1 也是 2 的幂次。
输出
输出数据仅有一行包含一个正整数表示小 S 最少要在天平的右端放置几个砝码,CZ 中 学的物理创新实验室里只有质量为 2 的幂次的砝码,并且每种砝码都取之不尽用之不竭。
样例输入
2
8 8
样例输出
1
AC代码
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll fun(ll t)
{
ll ans=1;
ll i;
if(t==0)
return 1;
for(i=0;i<t;i++)
ans*=2;
return ans;
}
bool cmp(ll x,ll y)
{
return x>y;
}
ll a[33],veg[10002];
ll slove(ll v)
{
ll num=0,i;
for(i=0;i<=30;i++)
{
ll c=v/a[i];
v-=c*a[i];
num+=c;
}
if(v>0)
num=-1;
return num;
}
int main()
{
ll n,i,count,sum=0;
for(i=0;i<=30;i++)
{
a[i]=fun(i);
}
sort(a,a+31,cmp);
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%lld",&veg[i]);
sum+=veg[i];
}
printf("%lld",slove(sum));
return 0;
}