zoukankan      html  css  js  c++  java
  • BZOJ 2241: [SDOI2011]打地鼠 暴力

    2241: [SDOI2011]打地鼠

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://www.lydsy.com/JudgeOnline/problem.php?id=2241

    Description

    打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。

    游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉所有的地鼠。你认为这锤子太没用了,所以你改装了锤子,增加了锤子与地面的接触面积,使其每次可以击打一片区域。如果我们把地面看做M*N的方阵,其每个元素都代表一个地鼠洞,那么锤子可以覆盖R*C区域内的所有地鼠洞。但是改装后的锤子有一个缺点:每次挥舞锤子时,对于这R*C的区域中的所有地洞,锤子会打掉恰好一只地鼠。也就是说锤子覆盖的区域中,每个地洞必须至少有1只地鼠,且如果某个地洞中地鼠的个数大于1,那么这个地洞只会有1只地鼠被打掉,因此每次挥舞锤子时,恰好有R*C只地鼠被打掉。由于锤子的内部结构过于精密,因此在游戏过程中你不能旋转锤子(即不能互换R和C)。

    你可以任意更改锤子的规格(即你可以任意规定R和C的大小),但是改装锤子的工作只能在打地鼠前进行(即你不可以打掉一部分地鼠后,再改变锤子的规格)。你的任务是求出要想打掉所有的地鼠,至少需要挥舞锤子的次数。

    Hint:由于你可以把锤子的大小设置为1*1,因此本题总是有解的。

    Input

     第一行包含两个正整数M和N;

    下面M行每行N个正整数描述地图,每个数字表示相应位置的地洞中地鼠的数量。

    Output

    输出一个整数,表示最少的挥舞次数。

    Sample Input

    3 3

    1 2 1

    2 4 2

    1 2 1

    Sample Output

    4

    HINT

    题意

    题解:

    并不满足二分性质,直接暴力就好了

    n^4方复杂度裸着跑就好了

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <bitset>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 200500
    #define mod 1001
    #define eps 1e-9
    #define pi 3.1415926
    int Num;
    //const int inf=0x7fffffff;
    const ll inf=999999999;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    //*************************************************************************************
    
    int M[110][110];
    int sum = 0;
    int ans = inf;
    int T[110][110];
    int n,m;
    void work(int x,int y)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                T[i][j]=M[i][j];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(T[i][j])
                {
                    int tmp = T[i][j];
                    if(i+x-1>n)return;
                    if(j+y-1>m)return;
                    for(int ii=0;ii<x;ii++)
                    {
                        for(int jj=0;jj<y;jj++)
                        {
                            T[i+ii][j+jj]-=tmp;
                            if(T[i+ii][j+jj]<0)return;
                        }
                    }
                }
            }
        }
        ans = sum/(x*y);
    }
    int main()
    {
        n=read(),m=read();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                M[i][j]=read(),sum+=M[i][j];
        for(int i=n;i>=1;i--)
        {
            for(int j=m;j>=1;j--)
            {
                if(sum%(i*j)==0&&ans>sum/(i*j))
                {
                    work(i,j);
                }
            }
        }
        printf("%d
    ",ans);
    }
  • 相关阅读:
    Unity动态批处理和静态批处理学习
    Mac下Unity使用Jenkins自动化打包
    Mac 环境环境下安装Git与使用(码云)
    MySQL: 6、MySQL语句
    MySQL: 5、MySQL索引、视图、存储过程
    MySQL: 4、多表、外键、数据库设计
    MySQL: 3、SQL语言 ②约束、事务
    MySQL: 2、SQL语言 ①概念、分类
    MySQL: 1、MySQL基础
    Mac 系统下如何显示和隐藏文件
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4794301.html
Copyright © 2011-2022 走看看