题解 P1150 【Peter的烟】
Linune_Gump · · 题解
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的数目变化了)
求管理员过
抽烟是不良行为,小朋友不要模仿哦!