题目:
你从一个神秘的来源收到了一个 n×mn×m 网格。这个来源还给了你一个神奇的正整数常数 kk 。
消息来源告诉你用一些颜色给网格着色,并满足以下条件:
- 如果 (x1,y1)(x1,y1) , (x2,y2)(x2,y2) 是两个颜色相同的单元格,那么 max(|x1−x2|,|y1−y2|)≥kmax(|x1−x2|,|y1−y2|)≥k 。
您不喜欢使用过多的颜色。请找出给网格着色所需的最少颜色数。
思路:
- 如果对数字敏感,可以从样例看出来结果是min(n, k) * min(m, k),不行的话就拼小脑袋瓜了
- 因为最大值要大于等于k,所以最好的方法是最大值等于k,如果是1 * m的图形,就是把第一行抽出来单独来看,第一个放置一个颜色,放置k个颜色之后重复k个颜色,直到到第m个格,所以1* m图形的结果是min(m, k),那么n * 1的结果就是min(n, k) ,可以推广到n * m 图形的结果就是min(n, k) * min(m, k),代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin >> t;
while(t--) {
int n, m, k;
cin >> n >> m >> k;
cout << min(n, k) * min(m, k) << endl;
}
return 0;
}