UVA 11384,Help is needed for Dexter(正整数序列)

Problem H

Help is needed for Dexter

Time Limit: 3 Second

 测试地址:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=456&page=show_problem&problem=2379

 

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;
}

 

 

转载于:https://www.cnblogs.com/standupvangurad/archive/2013/04/14/3020305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值