公交消费
一、审题
题目描述
小明是个天选打工人,每天都需要乘坐公交,每次乘坐公交需要消费
0.5 0.5 0.5 元,每天需要乘坐两次公交来回,现公交系统推出公交优惠消费活动,每消费 k k k 元,就可以获赠 1 1 1 元,一开始小明有 n n n 元,他想知道在自己不充值的情况下最多能够坚持几天?
输入描述
输入文件名
bus.in
输入包含多个测试数据,每个测试数据包含2个整数 n n n 和 k k k( 2 < ≤ k ≤ n ≤ 1000 2<\le k\le n\le1000 2<≤k≤n≤1000),当 n n n 和 k k k 都为 0 0 0 时表示输入结束,且此时不需要输出结果
输出描述
输出文件名
bus.out
对于每个输入的测试数据都需要输出一个整数,表示在不充值的情况下,最多坚持的天数,每个数据占据一行。
二、思路
每次都无条件进入循环,有两种写法:
- 死循环
while (true)
{cin >> n >> k;if (n == 0 && k == 0){break;}// …
}
- 每次输入
while (cin >> n >> k)
{if (n == 0 && k == 0){break;}// …
}
我们可以假设,如果 n = 4 n=4 n=4, k = 2 k=2 k=2 的时候,我们一天一天的推导。
天数 | n | 连续消费 | 连续消费==k |
---|---|---|---|
1 | 3 | 1 | false |
2 | true | ||
3 | 2 | 1 | false |
4 | true | ||
5 | 1 | 1 | false |
6 | true | ||
7 | 0 | 1 | / |
伪代码如下:
while (cin >> n >> k)if (n == 0 && k == 0)break;end ifday = 0;cnt = 0;while (n)day++;cnt++;n--;if (cnt == k)cnt = 0;n++;end ifend whileprint day
end while
三、参考答案
#include <iostream>
#include <cstdio>
using namespace std;int n, k;
int day, cnt;int main()
{freopen("bus.in", "r", stdin);freopen("bus.out", "w", stdout);while (cin >> n >> k){if (n == 0 && k == 0){break;}day = 0;cnt = 0;while (n){day++;cnt++;n--;if (cnt == k){cnt = 0;n++;}}cout << day << endl;}fclose(stdin);fclose(stdout);return 0;
}