【纪中模拟2019.08.17】【JZOJ3503】粉刷

题目链接

题意:

  给定一个$N\times M$的$01$矩阵,要求覆盖所有$1$的位置,求最小操作次数。一次操作,可以竖着覆盖连续的最多$C$列,或者横着覆盖连续的最多$R$行。

  $1\le\;N,\;M,\;R,\;C\le\;15$

分析:

  数据范围较小,考虑枚举。

  但是不能盲目地同时枚举覆盖行、覆盖列的操作,因为这样的枚举是$O (2^{2N})$的,会$T$。

  考虑枚举覆盖行的操作,枚得一种方案之后贪心地计算覆盖列的操作,完成。

  总的时间复杂度$O (N^3\times 2^N)$。

实现:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define IL inline
using namespace std;
const int N=15;

    int n,m,r,c;
    int bod[N+3][N+3];
    int clm[N+3];
    int tbod[N+3][N+3];
    int tclm[N+3];

int main(){
    scanf("%d %d\n",&n,&m);
    memset(bod,0,sizeof bod);
    for(int i=0;i<n;i++){
        char ch;
        for(int j=0;j<m;j++){
            scanf("%c",&ch);
            bod[i][j]=ch==‘X‘;

        }
        scanf("\n");

    }
    scanf("%d %d\n",&r,&c);

    memset(clm,0,sizeof clm);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            clm[i]+=bod[j][i];

    memcpy(tbod,bod,sizeof bod);
    memcpy(tclm,clm,sizeof clm);
    int ans=min(n/r+1,m/c+1);
    for(int S=0;S<(1<<n);S++){
        int cnt=0;

        for(int i=0;i<n;i++)
        if(S>>i&1){
            cnt++;
            for(int j=0;j<r;j++)
                for(int k=0;k<m;k++)
                if(bod[i+j][k]==1){
                    bod[i+j][k]=0;
                    clm[k]--;

                }

        }

        for(int i=0;i<m;i++)
        if(clm[i]>0){
            cnt++;
            for(int j=0;j<c;j++)
                clm[i+j]=0;

        }

        memcpy(bod,tbod,sizeof tbod);
        memcpy(clm,tclm,sizeof tclm);

        ans=min(ans,cnt);

    }

    printf("%d",ans);

    return 0;

}

小结:

  考虑对枚举进行剪枝的同时,也考虑一下优化枚举的结构吧。

原文地址:https://www.cnblogs.com/Hansue/p/11369362.html

时间: 2024-08-29 12:23:09

【纪中模拟2019.08.17】【JZOJ3503】粉刷的相关文章

【纪中模拟2019.08.03】【JZOJ1308】取数游戏

题目链接 题意: N个正整数围成一圈,规则如下: •两个玩家轮流取数:•先手玩家取任意一个数x:•从第二步开始当前玩家只能取x(上一玩家取的数)相邻的数:•直到取完所有的数,游戏结束:•取得较多奇数的玩家获胜. 保证双方都采取最优策略的同时,计算先手有多少种取法获胜. $1\le N\le 10^2,\quad 1\le x\le 10^3$ 实现(100分): 因为笔者不会SG函数,所以如果有绕弯子的描述请谅解. 分析博弈过程,有$2^n$种形势,按博弈写程序会T. 考虑DP,貌似取数的过程有

【纪中集训2019.08.21】【JZOJ6315】数字

题目链接 题意: 设$s(i)$为将$1\sim i$看做字符串后依次连接形成的串.给定正整数$n$,求最小的$i$使得$n$是$s(i)$的字串.$T$组数据. $n\le 10^{17}, \; t\le 10^4$ 分析: 不能模拟$s(i)$的组成过程来找答案,时间不能承受. 也不能预处理$s(k)$,空间不能承受. 那就只能在$n$上找答案. 以下把数字当成字面量来讨论,更方便. 同时,这里讨论的前缀和后缀不包括本身. 思考一下,答案分为三种: 1.$ans=n$ 2.$n$由$ans

【纪中集训2019.08.20】【JZOJ6310】Global warming

题目链接 题意: 给出一个长度为$n$的序列$\{a_n\}$. 已知一个正整数$x$,你有一次机会指定区间$[l,r]$,令$\forall i\in [l,r],\;a_i=a_i+d\,(|d|\le x)$. 求最大化的最长上升子序列的长度. $1 \le n \le 2 \times 10^5 , \quad 1 \le a_i,x \le 10^9$且均为正整数. 分析: 可以很容易发现三个性质: 性质一:抬升$[l,r]$不优于抬升$[l,n]$,降低$[l,r]$不优于降低$[1

纪中集训2019.11.08

A.三角形计数 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 B.Isaac 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 C.字符消除 题目链接 题意: 咕 分析: 咕 实现: 咕 小结: 咕 当天总结: 咕 原文地址:https://www.cnblogs.com/Hansue/p/11826709.html

【纪中集训2019.3.12】Mas的仙人掌

题意: ? 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: 题解: 考虑每一条边的贡献是\((1-p_{i})*\Pi_{j}p_{j}(j!=i)\),这里\(j\)和\(i\)不能同时加入: 一条加入的边可以看成一条树上路径 ,即求所有和路径\(i\)相交的路径\(j\)的\(p_{j}\)的乘积: 将一条树上的链\((u,v)\)拆成两条\((u,lca)\)和\((v,lca)\); 这样会

【纪中集训2019.3.29】整除分块

题目 描述 ? 本题的背景是整除分块: ? 定义一个数列$a_{n,i} ? = ?\lfloor \frac{n}{i} \rfloor $ ; ? 求$\sum_{i=l}^{r} mex(a_n) $ ; ? 其中\(mex\)表示序列中最小的没有出现过的自然数: ? 答案对\(998244353\)取模 : 范围 ? \(1 \le T \le 65536 \ , \ 1 \le l ,r \le 10^{36}\) : ? 评测系统支持使用 $ _ _ int218 $ ,但是不能直接

【纪中集训2019.3.20】河

题目 描述 给出\(n\)条河流,每条河流是形式为\(k_{i}x+b_{i}\)的一次函数且只有\(x\)轴正半轴的部分: 河流的污染部分和另外一条河流的干净部分交汇,干净的部分会被污染: 有若干个工厂要建在\(b_{i}\)处,问有多少种方案使得所有的河流在无穷远处被污染: 答案对\(1e9+7\)取模 范围 $1 \le N \le 5 \times 10^5 ? ?, ??|k_{i}|,|b_{i}| \le 10^9 $ 保证\(b_{i}\)互不相同: 题解 需要先找到可以被一条河

2019.08.17 Webpack4 bilibi

将这些依赖打包吗? es6转es5,将sass,less,转成css.文件优化:压缩代码体积,合并文件. 代码分割:公共模块的处理,路由懒加载功能.模块合并:功能模块分类 自动刷新 原文地址:https://www.cnblogs.com/Py-king/p/11368326.html

纪中集训2019.11.06

A.困难的图论 题目链接 题意: 给出由$n$个点和$m$条边构成的无向连通图,要求选出一些边.一条边被选中当且仅当它恰好被一个简单环经过. 一个环被称为简单环,当且仅当这个环上的所有点都只在这个环中被经过了一次. 输出这些边的编号的异或和.边从$1$开始编号. $1\le n\le 10^6,\;1\le m\le min\{10^6,n\times (n+1) /2\}$. 分析: 注意:一个图可能有很多简单环,题目要求选中所有简单环上的边.考场上我就是这一点搞错了.(其实搞对了也很可能做不