链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
有一个 n×mn \times mn×m 的网格,每个格子上站着一个血量为 kkk 的敌人。瓜瓜每次可以选择一个格子进行轰炸。
轰炸过后该格子上的所有敌人都会发生如下变化
- 如果受到伤害的敌人血量为 111,那么他会战死;
- 如果受到伤害的敌人血量大于 111,那么他会失去一点血量值,并随机的跑到一个相邻的网格(仅上下左右);
瓜瓜想节省自己的弹药,请你帮他计算至少需要进行多少次轰炸,可以保证消灭所有敌人(无论敌人朝哪个方向逃跑)。
输入描述:
第一行有一个正整数 TTT, 表示有 T(1⩽t⩽104)T(1 \leqslant t \leqslant 10^ 4)T(1⩽t⩽104) 组样例。 每组样例,每行有三个正整数 n,m,kn, m, kn,m,k,其中 1⩽n,m⩽104,1⩽k⩽1081 \leqslant n, m \leqslant 10^ 4, 1 \leqslant k \leqslant 10^81⩽n,m⩽104,1⩽k⩽108
输出描述:
输出 TTT 行, 每行输出一个整数表示答案
示例1
输入
复制2 1 3 1 1 3 2
2 1 3 1 1 3 2
输出
复制3 4
3 4
说明
对于第一组样例,有相邻的三个格子,格子上有一个一滴血的敌人,轰炸三次即可 对于第二组样例,有相邻的三个格子,我们选择依次轰炸:中间的格子,两侧的格子各一次,中间的格子。这样可以保证消灭所有敌人。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int n, m, k;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> T;
while (T--)
{
cin >> n >> m >> k;
if (n == 1 && m == 1)
cout << k << endl;
else if (n * m % 2 == 0)
{
cout << n * m / 2 + (n * m / 2) * k << endl;
}
else
{
if (k % 2 == 0)
{
int temp1 = n * m / 2 + 1 + (n * m / 2) * (k / 2) + (n * m / 2 + 1) * (k / 2);
int temp2 = n * m / 2 + (n * m / 2 + 1) * (k / 2) + (n * m / 2) * (k / 2);
int ans = min(temp1, temp2);
cout << ans << endl;
}
else
{
int temp1 = n * m / 2 + 1 + (n * m / 2) * (k / 2 + 1) + (n * m / 2 + 1) * (k / 2);
int temp2 = n * m / 2 + (n * m / 2 + 1) * (k / 2 + 1) + (n * m / 2) * (k / 2);
int ans = min(temp1, temp2);
cout << ans << endl;
}
}
}
return 0;
}