您的位置:首页 > 编程语言 > Java开发

ZOJ 3498 Javabeans

2013-07-04 20:03 381 查看
ZOJ 3498Javabeans
           http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4321     这个时候整个422实验室就只剩下了3个女生,很多人都去参加什么暑假社会实践的出征仪式。为什么ACM这件事在很多人看来这么地位低下,不值得付出。真的很难过。

    题意:这道题一开始完全读不懂题意,还要问老师。这道题就是说,有n个盒子,盒子中豆豆的数目分别为1~n,现在,给出盒子的数目,如果你决定第一天吃3个豆豆,那么就从盒子中豆豆数目大于等于3个的每个盒子中吃掉3个豆豆,以此类推,问最快几天能吃掉所有盒子中的所有豆豆。

    思路:

    看了别人的解题并且听老师讲了,吃的最快的关键是折半,因为每次可以吃多个盒子,这样每吃一次,整体数据就会小一倍。

    例如:

       盒子数目:

          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17……

       吃完要求的天数:

          1 2 2 3 3 3 3 4 4 4 4  4  4  4  4  5   5……

       于是找到了关于2的幂的规律。

                             1 2 3 4 5 6 7

       第一天吃7/2+1 = 4个   1 2 3 0 1 2 3

       第二天吃3/2+1 = 2个   1 0 1 0 1 0 1

       第二天吃1/2+1 = 1个   0 0 0 0 0 0 0

       天数为按照以上盒子数目不断除以二,除到零为止,求次数。

    细节+代码如下:

   

#include<stdio.h>
#include<math.h>
int main(){
int T,n,i;
float a,b,c,j;
scanf("%d",&T);
for(i = 1;i<=T;i++){
scanf("%d",&n);
if(n==1){
printf("1\n");
continue;
}
for(j = 0;;j++){
if(n>=pow(2,j)&&n<pow(2,(j+1))){ /*pow(a,b)函数求的是a的b次方,而且其中的参数必须是*/
printf("%.f\n",j+1);         /*float类型,返回值自然也是float类型。*/
break;
}
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: