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
给出数字n 用最少的操作次数把序列1-n中的所有数字都编程0 每次操作可以从序列中选择一个或者多个数 同时减去一个相同的正整数
通过对题目的分析我们可以考虑下一个问题 如果有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> #include <cstdio> #include <cstring> using namespace std; int alpha(int m); int main(){ int n; while(scanf("%d", &n)!=EOF){ printf("%d\n", alpha(n)); } return 0; } int alpha(int m){ return m == 1 ? 1 : alpha(m/2) + 1; }
版权声明:本文为博主原创文章,未经博主允许不得转载。