zoj 3498 Javabeans 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3498
题目大意:有n个box,第i个里装有i个javabean,人每天在1~n里选一个数x,然后吃掉每个号大于x的box里的x个javabean,问最快几天吃完。
题目分析:每次都找最中间的那个数,这样就消掉总bean数n*(n-1)/2中的一半。一尺之锤,日取其半,只要用整形数的除法法则,就不会万世不竭的,记下天数就是答案。
以下是代码:
#include<stdio.h>
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
int s=0;
scanf("%d",&n);
for(s++;n/=2;)
s++;
printf("%d\n",s);
}
return 0;
}
下面是我找的一个其它做法,貌似是思路没什么两样,就是麻烦了点
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int a[31];
long long k=1;
for(int i=0;i<31;i++)
{
a[i]=k;
k*=2;
}
int t;
cin>>t;
while(t--)
{
int sum=0,n;
cin>>n;
k=0;
for(int i=0;;i++)
{
sum+=a[i];
k++;
if(sum>=n)
break;
}
cout<<k<<endl;
}
return 0;
}
再下是一个递推
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#define LL long long
#define MAXI 2147483647
#define MAXL 9223372036854775807
#define eps (1e-8)
#define dg(i) cout << "*" << i << endl;
using namespace std;
int Solve(LL n)
{
if(n == 1) return 1;
return 1 + Solve(n / 2);
}
int main()
{
LL n; //尽管n是32位整型,但为免运算过程中发生溢出,仍设为64位
int t;
cin >> t;
while(t--)
{
cin >> n;
cout << Solve(n) << endl;
}
return 0;
}
PS:赞美伟大的数学。