Py&hyh想脱单 暴力

题目来源:

2018年长沙理工大学ACM第二次省赛选拔赛 2018年8月10日

题意:

众所周知,pyhyh有十分浓烈的脱单意愿,但是非常不幸,在一个风和日丽的下午,他们穿越到一个没有妹子的世界,他必须回答一个问题才能回到本来的世界,这个问题是给出一个 n m 的矩阵,然后有q次操作,每一个操作,给出 x i , y i , t i ,表示在 t i 时刻摧毁 ( x i , y i ) 这个格子,然后他们要求出一个最早时刻,出现至少一个 k k 的矩阵被毁坏,注意:一个 k k 矩阵被毁坏的意思是某一个 k k 的矩阵中的每一个格子都被摧毁过一次或一次以上。聪明的acmer能帮他们回答这个问题吗(如果没人能ac这个题,就代表他们两个没有脱单的可能了哦)

输入:

采用多组输入,第一行输入
n,m,k,q,( 1 n ,  m 500 , 1 k m i n ( n , m ) ,  1 q n m )
分别代表 n m 的矩阵, k k 的矩阵,和q次操作接下来q行每一行输入 x i , y i , t i ( 1 x i n , 1 y i m , 0 t 10 6 ),代表在 t i 这个时刻, x i y i 这个位置会被摧毁.

输出:

输出一行,代表最早时刻出现至少一个 k k 的矩阵被毁坏如果永远不存在这一个时刻,输出-1

题解:

这道题在赛场上没A,赛场上写的代码与AC代码就差了两行,可惜了。
纯暴力题目,四个for循环就能解决。两个for管大矩形,两个for管 k k 矩形,总复杂度是O( 250 4 ),比较高,但是数据比较水,能过。

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;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81586347