题目背景
温馨提示:吸烟有害健康,请勿尝试吸烟!
题目描述
Peter 有 n 根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?
与某些脑筋急转弯不同的是,Peter 并不能从异次元借到烟蒂,抽完后再还回去。
输入格式
每组测试数据一行包括两个整数 n,k(1<n,k≤108)。
输出格式
对于每组测试数据,输出一行包括一个整数表示最终烟的根数。
输入输出样例
输入 | 输出 |
4 3 | 5 |
10 3 | 14 |
说明/提示
对于 100% 的数据,1<n,k≤。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int Smoke(int x,int n){
int k,i;
for(i=0;i<x;i++){
k++;
if(k>=n){
x++;
k=0;
}
}
return x;
}
int main(){
int x,n;
cin>>x>>n;
cout<<Smoke(x,n)<<endl;
}
思路
因为Peter烟蒂可以换额外的烟,烟吸的越少就越容易分析。比如,当k=10时,就是10个烟蒂可以换一根烟,此时当烟的根数(x)小于10时,Peter不管怎么吸都换不到烟,最终总的烟的根数就是x。
按照这个思路,我们让Peter一根一根吸烟,当吸烟根数超过可以用烟蒂换烟时,我们就让Peter多抽一根,直到最后烟蒂换不了烟时就可以了。
代码解析
x | 初始烟的数量 |
n | 烟蒂换烟的阈值 |
k | 记录烟蒂的数量 |
i | 没啥意义 |
for语句从0开始循环输入,当i<x时循环停止,同时k++。Peter抽一根烟就让烟蒂增加一个。
在Peter一根根抽烟的同时,加入一个判断在循环里面,来处理烟蒂可以换烟的情况。
因为我们记录了烟蒂的数量,当烟蒂的数量(k)大于或等于烟蒂换烟的阈值(n)时,我们就让亲爱的Peter多抽一根烟,就是x++这条语句,同时记得要让k值初始化一下(k=0),就是让Peter的烟蒂清零,要不然用烟蒂换了烟,烟蒂怎么没有消耗呢。
最后返回x的值就行了,因为烟蒂换烟时x已经自增了,所以x的值就是烟蒂总数。
可以想象给了Peter一大堆烟,当3个烟蒂可以换烟时,Peter就三根一抽,同时还给Peter一根烟,把这一根烟加到Peter的一大堆烟里,然后Peter继续三根三根抽烟,直到最后烟蒂换不了烟时。
不需要把一大堆烟全部数出来再算烟蒂再算烟的总数。