Problem H
Help is needed for Dexter
Time Limit: 3 Second
测试地址:
Dexter is tired of Dee Dee. So he decided to keep Dee Dee busy in a game. The game he planned for her is quite easy to play but not easy to win at least not for Dee Dee. But Dexter does not have time to spend on this silly task, so he wants your help.
There will be a button, when it will be pushed a random number N will be chosen by computer. Then on screen there will be numbers from 1 to N. Dee Dee can choose any number of numbers from the numbers on the screen, and then she will command computer to subtract a positive number chosen by her (not necessarily on screen) from the selected numbers. Her objective will be to make all the numbers 0.
For example if N = 3, then on screen there will be 3 numbers on screen: 1, 2, 3. Say she now selects 1 and 2. Commands to subtract 1, then the numbers on the screen will be: 0, 1, 3. Then she selects 1 and 3 and commands to subtract 1. Now the numbers are 0, 0, 2. Now she subtracts 2 from 2 and all the numbers become 0.
Dexter is not so dumb to understand that this can be done very easily, so to make a twist he will give a limit L for each N and surely L will be as minimum as possible so that it is still possible to win within L moves. But Dexter does not have time to think how to determine L for each N, so he asks you to write a code which will take N as input and give L as output.
Input and Output:
Input consists of several lines each with N such that 1 ≤ N ≤ 1,000,000,000. Input will be terminated by end of file. For each N output L in separate lines.
SAMPLE INPUT | OUTPUT FOR SAMPLE INPUT |
1 2 3 | 1 2 2 |
Problemsetter: Md. Mahbubul Hasan
翻译:
Help is needed for Dexter
给定正整数n,你的任务是用最少的操作次数把序列1,2,3,…,n中的所有数都变成0。每次操作可从序列中选择一个或者多个整数,同时减去一个相同的正整数。比如,1,2,3可以把2和3同时减小2,得到1,0,1;
Input and Output:
输入包含多组数据。每组仅一行,为正整数n(n<=10^9)。输入结束标志为文件结束符(EOF)。
对于每组数据,输出最少的操作次数。
SAMPLE INPUT | OUTPUT FOR SAMPLE INPUT |
1 2 3 | 1 2 2 |
【分析】
通过对题目的分析我们可以考虑下一个问题,如果有n个数字,但是这些数字只是1、2、3的情况,根据游戏的规则,他们和问题中n=3的可以说是等价的。你可以试下,所以说为了是问题简单,一个n的问题必须化解成一个比这个简单的问题,为此我们就要找到这种问题的递推公式。
思考下,如果每次我们给后面一般的数减去个n/2则问题就化简成了n/2的问题。
例如,n=6时,将4,5,6,同时减去个3,则数据就变成了{1,2,3,1,2,3}此问题等价于n=3时的问题;
所以得到递推公式 f(n)=f(n/2)+1;
#include <iostream>
using namespace std;
int f(int n){
if (n==1)return 1;
return f(n/2)+1;
}
int main()
{
int n;
while(cin>>n)
cout<<f(n)<<endl;
return 0;
}