• 【Codeforces Round #423 (Div. 2) B】Black Square


    Link:http://codeforces.com/contest/828/problem/B

    Description

    给你一个n*m的格子;
    里面包含B和W两种颜色的格子;
    让你在这个格子中画一个正方形;
    (大小,位置自己选但要求覆盖到所有现有的黑棋子);
    然后,把里面的白棋子,染成黑棋子;
    问你最少需要染多少个白棋子;

    Solution

    先得到一个矩形(这个矩形覆盖所有的黑棋子);
    然后枚举所需要的正方形的左上角的位置;
    这个正方形必然要覆盖这个矩形;
    则这个左上角只能在这个正方形的左上角的左上方,或和正方形的左上角重合;
    取那个矩形的右下角,只要正方形能够覆盖到右下角,就能覆盖整个矩形;
    剩下的就不难写了;
    获取正方形应该有的最小边长;
    然后统计这个正方形里面W的个数就好;

    NumberOf WA

    0

    Reviw

    做题的时候不用着急:)
    慢慢想

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 110;
    
    int n,m,mini = N,maxi = 0,minj = N,maxj = 0;
    char s[N][N];
    
    int main(){
        scanf("%d%d",&n,&m);
        rep1(i,1,n) scanf("%s",s[i]+1);
        rep1(i,1,n){
            rep1(j,1,m)
            if (s[i][j]=='B'){
                mini = min(mini,i);
                maxi = max(maxi,i);
                minj = min(minj,j);
                maxj = max(maxj,j);
            }
        }
        if (maxi==0){
            printf("1
    ");
            return 0;
        }
        int num = N*N;
        rep1(i,1,n){
            rep1(j,1,m){
                if (i <= mini && j <= minj){
                    int lenj = maxj-j+1,leni = maxi-i+1;
                    lenj = max(lenj,leni);
                    int rj = j + lenj-1,ri = i + lenj -1;
                    if (rj > m || ri > n) continue;
                    int temp = 0;
                    rep1(ii,i,ri)
                        rep1(jj,j,rj)
                            if (s[ii][jj]=='W')
                                temp++;
                    num = min(num,temp);
                }
            }
        }
        if (num > n*n)
            printf("-1
    ");
        else
            printf("%d
    ",num);
        return 0;
    }
  • 相关阅读:
    java 微信公众服务平台 下发 模板消息
    java web实现 忘记密码(找回密码)功能及代码
    DES加密后get获取url参数无法解密问题
    java实现url转码、解码
    java 实现 DES加密 解密算法
    oracle sqlplus 导出csv文件
    oracle导出多CSV文件的靠谱的
    Oracle 释放过度使用的Undo表空间
    Archiving not possible: No primary destinations errors
    Linux 之 shell 比较运算符
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626206.html
Copyright © 2020-2023  润新知