解题思路

先辈家里有 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;
}