zoukankan      html  css  js  c++  java
  • Luogu P2484 [SDOI2011]打地鼠(模拟+前缀和)

    P2484 [SDOI2011]打地鼠

    题意

    题目描述

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

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

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

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

    输入输出格式

    输入格式:

    第一行包含两个正整数(m)(n)

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

    输出格式:

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

    输入输出样例

    输入样例#1:

    3 3
    1 2 1
    2 4 2
    1 2 1
    

    输出样例#1:

    4
    

    说明

    【样例说明】

    使用(2 imes 2)的锤子,分别在左上、左下、右上、右下挥舞一次。

    【数据规模和约定】

    对于(30\%)的数据,(m,nleq 5)

    对于(60\%)的数据,(m,nleq 30)

    对于(100\%)的数据,(1leq m,nleq 100),其他数据不小于(0),不大于(10^5)

    思路

    枚举锤子大小,然后判断大小的锤子能否达成要求。

    (a[i][j])((i,j))位置上的地鼠个数,(b[i][j])为在以((i,j))为左上角点的矩形上挥舞锤子的次数,(s[i][j])为在((1,1))((i,j))范围内挥舞锤子次数的综合,也就是(b)数组的二维前缀和。

    判断大小为(x imes y)的锤子是否能达成目的。当前几行的锤子挥舞次数已经被统计出来之后,((i,j))位置上已经被打死了的地鼠个数为:

    [s[max{ 0,i-x} ][j]+s[i][max{ 0,j-y }]-s[max{ 0,i-x} ][max{ 0,j-y} ] ]

    如果这个数量已经超过了该点上应该被杀死的地鼠个数,那么这样大小的锤子不能达成目的。

    同时,横坐标在([m-y+2,m])范围内的点或纵坐标在([n-x+2,n])范围内的点的(b)值应该为零,因为锤子不能锤出去了。

    枚举锤子大小是(O(nm))的,一次判断是(O(nm))的,所以总的时间复杂度为(O(n^2m^2)),可以通过此题。

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    LL n,m,sum,ans=LLONG_MAX,a[105][105],s[105][105],b[105][105];
    LL read()
    {
        LL re=0;char ch=getchar();
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
        return re;
    }
    bool judge(LL x,LL y)
    {
        memset(s,0,sizeof s);
        for(LL i=1;i<=n;i++)
            for(LL j=1;j<=m;j++)
            {
                s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
                LL tmp=s[i][j]-s[max(LL(0),i-x)][j]-s[i][max(LL(0),j-y)]+s[max(LL(0),i-x)][max(LL(0),j-y)];
                if(tmp>a[i][j]) return false;
                b[i][j]=a[i][j]-tmp;
                s[i][j]+=b[i][j];
            }
        for(LL i=1;i<=n;i++)
            for(LL j=m-y+2;j<=m;j++)
                if(b[i][j]) return false;
        for(LL i=n-x+2;i<=n;i++)
            for(LL j=1;j<=m;j++)
                if(b[i][j]) return false;
        return true;
    }
    int main()
    {
        n=read(),m=read();
        for(LL i=1;i<=n;i++)
            for(LL j=1;j<=m;j++)
                a[i][j]=read(),sum+=a[i][j];
        for(LL i=1;i<=n;i++)
            for(LL j=1;j<=m;j++)
                if(judge(i,j)) ans=min(ans,sum/(i*j));
        printf("%lld",ans);
        return 0;
    }
    
  • 相关阅读:
    ssh框架中文保存数据库MySQL乱码
    SSH ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor
    SSH(六)hibernate持久层模板于事务管理
    SSH(五)spring整合hibernate
    javaweb string
    spring加载配置文件
    order by 与 group by 区别
    PowerDesigner从SqlServer数据库中导入实体模型
    方向
    关于Hibernate 的数据库配置
  • 原文地址:https://www.cnblogs.com/coder-Uranus/p/9904272.html
Copyright © 2011-2022 走看看