题解 P1150 【Peter的烟】

· · 题解

P1150 Peter的烟 题解

题目链接:P1150 Peter的烟

已经第三次了,我好好排排版吧[笑哭]

毫不夸张的说,这题真的挺简单的。。我这个蒟蒻都会。。

不过看到各位奆佬用的都是循环,就想再写一种递归的解法

(吐槽一下)其实,我对递归有这样一种认识。我们知道,函数是一种解决问题的方法,对于每个函数而言,他都有自己的功能。同时,我们在使用函数的时候并不需要知道他的内部是怎么运行的。

我见过很多老师讲递归讲回溯的时候都把他们当作一个模板,这样其实是不好的。当认为函数是一个功能去使用的时候递归其实就比较好理解了。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int tot,k;//tot表示他一共抽了多少烟,k表示多少烟换一根烟 
void f(int n)//x表示这一轮抽了多少烟,n表示他还有多少烟 
{
    int x;
    if(n/k==0)//不够抽了,把剩下的抽完
    {
        tot+=n;//剩下的n根抽完
        return ;
    } 
    x=n/k,n=n%k+x,tot+=x*k;//抽完一部分烟之后重新统计还有多少烟以及一共抽了多少烟
    f(n);//现在,Peter拥有了重新统计的n根烟,又可以愉快的抽烟了
} 
int main()
{
    int n;
    scanf("%d%d",&n,&k);
    f(n);//函数f(n)表示有n根烟能抽几根
    printf("%d1\n",tot);//总抽烟量在tot中
    return 0;//请不要抄袭我的代码,不然可能会WA哦
}

Peter抽烟 流程:

有n根烟,开始抽烟

step 0:-->如果peter本来就没有k根,意味着他只能抽n根,没办法换烟了,总烟量加上n,就不抽了

step 1:-->尽量多抽,不足k根为止

(因为C++整数除法会向下取整,所以抽掉(n/k*k)根)

step 2:-->统计到总抽烟数量中去

step 3:-->换到烟x根,加到总数目n中去

step 4:-->下一轮抽烟,这次他有n根,

回到step 0 重新开始一轮递归

(但是n的数目变化了)

求管理员过

抽烟是不良行为,小朋友不要模仿哦!