题目来源:
2018年长沙理工大学ACM第二次省赛选拔赛 2018年8月10日
题意:
众所周知,py和hyh有十分浓烈的脱单意愿,但是非常不幸,在一个风和日丽的下午,他们穿越到一个没有妹子的世界,他必须回答一个问题才能回到本来的世界,这个问题是给出一个 的矩阵,然后有q次操作,每一个操作,给出 , , ,表示在 时刻摧毁 这个格子,然后他们要求出一个最早时刻,出现至少一个 的矩阵被毁坏,注意:一个 矩阵被毁坏的意思是某一个 的矩阵中的每一个格子都被摧毁过一次或一次以上。聪明的acmer能帮他们回答这个问题吗(如果没人能ac这个题,就代表他们两个没有脱单的可能了哦)
输入:
采用多组输入,第一行输入
n,m,k,q,(
,
,
,
分别代表
的矩阵,
的矩阵,和q次操作接下来q行每一行输入
(
),代表在
这个时刻,
,
这个位置会被摧毁.
输出:
输出一行,代表最早时刻出现至少一个 的矩阵被毁坏如果永远不存在这一个时刻,输出-1
题解:
这道题在赛场上没A,赛场上写的代码与AC代码就差了两行,可惜了。
纯暴力题目,四个for循环就能解决。两个for管大矩形,两个for管
矩形,总复杂度是O(
),比较高,但是数据比较水,能过。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 510;
int a[maxn][maxn];
int n, m, k, q, t1, t2, t3;
inline int solve(int row, int line) {
int mmax = -1;
for (int i = row; i < row + k; i++)
for (int j = line; j < line + k; j++) {
if (a[i][j] == INF)//比赛的时候就少了这两行
return INF;//当扫到INF的时候就不用扫了,直接break就行
mmax = max(mmax, a[i][j]);
}
return mmax;
}
int main(void) {
while (~scanf("%d%d%d%d", &n, &m, &k, &q)) {
int t1, t2, t3;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] = INF;
for (int i = 1; i <= q; i++) {
scanf("%d%d%d", &t1, &t2, &t3);
a[t1][t2] = min(t3, a[t1][t2]);
}
int i_n = n - k + 1;
int j_n = m - k + 1;
int mmin = INF;
for (int i = 1; i <= i_n; i++)
for (int j = 1; j <= j_n; j++)
mmin = min(solve(i, j), mmin);
if (mmin == INF)
printf("-1\n");
else
printf("%d\n", mmin);
}
return 0;
}