解题思路
先辈家里有 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;
}
京公网安备 11010502036488号