解题思路
先辈家里有 n 个大小为 1 的面包和 m 个大小为 2 的面包,先辈要求后辈把所有面包吃完。
后辈每吃一块面包,就会积累等同面包大小的饱腹值,当后辈的饱腹值 > k 时,就会因为吃太撑没力气昏倒。后辈可以选择喝一次红茶消除当前所有的饱腹值,求后辈想在不昏倒的情况下,喝红茶的最少次数。
如果 k 为偶数,喝红茶次数为 cnt = (n + 2 * m) / k
。
如果余数为 0,表示喝茶 cnt - 1
次后,清空饱腹值,还吃了 k
大小的面包,此时饱腹值为 k,没有昏倒,也不需要吃了,所以也不需要喝最后一次茶,所以 cnt -= 1
。
如果 k
为奇数,可以吃大小为 2 的面包至 k - 1
饱腹值,再吃 1
个大小为 1 的面包(如果有的话),至 k
饱腹值,再喝茶。
最后吃剩下的大小为 2 和 1 的面包(如果有的话)。
C++代码
#include<cstdio> using namespace std; int main(){ int T; scanf("%d", &T); long long n, m, k; while(T--){ scanf("%lld%lld%lld", &n, &m, &k); long long cnt = 0; m *= 2; if(k % 2 == 0){ n += m; cnt += n / k; n %= k; if(n == 0) --cnt; } else{ long long tmp = m / (k-1); m %= (k-1); cnt += tmp; if(n > tmp) n -= tmp; else n = 0; n += m; cnt += n / k; n %= k; if(n == 0) --cnt; } printf("%lld\n", cnt); } return 0; }