codeforces 425B Sereja and Table (枚举、位图)
输入n*m的01矩阵、以及k。
n,m<=100,k<=10
问修改至多k个,使得矩阵内的各连通块(连着的0或1构成连通块)都是矩形,且不含另外的数字(边界为0(1)的矩形内不含1(0)),求最少修改个数。
再次感觉以前见过类似的。。。。完全不会。。。
看了题解再看别人的代码才搞懂。。。。
首先,要知道一个结论,满足题意的矩阵,任意2行(列)的抑或值必须为全0或全1。
然后,分类讨论,
如果可以修改个数k<n,如果有答案,那必然至少有一行是没修改的,枚举不修改的行,统计。
k>=n的时候,必然有n,m<=10,这时候可能每一行都有修改,故枚举标准列的情况,即int i=0;i<(1<<n);++i,统计。
复杂度应该是,max(100^3, 100*10*2^10)=10^6
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <set>
using namespace std; #define ll long long
#define inf 0x3f3f3f3f
#define eps 1e-8 int a[][];
int main(){
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=;i<n;++i)for(int j=;j<m;++j)scanf("%d",a[i]+j);
int ans=k+;
if(k<n){
for(int i=;i<n;++i){
int tmp=;
for(int j=;j<n;++j){
int dis=;
for(int k=;k<m;++k)
dis+=(a[i][k]^a[j][k]);
tmp+=min(dis,m-dis);
}
ans=min(ans,tmp);
}
}
else {
for(int i=(<<n)-;i>=;--i){
int tmp=;
for(int j=;j<m;++j){
int dis=;
for(int k=;k<n;++k)
if((i&(<<k))==(a[k][j]<<k))
dis++;
tmp+=min(dis,n-dis);
}
ans=min(ans,tmp);
}
}
if(ans==k+)puts("-1");
else printf("%d\n",ans);
}
return ;
}
codeforces 425B Sereja and Table (枚举、位图)的更多相关文章
- codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量 ...
- Sereja and Table CodeForces - 425B (暴力,状压)
大意: 给定01矩阵, 求翻转尽量少的数字, 使得所有0或1的连通块为矩形, 若至少要翻转超过k次, 输出-1
- Codeforces 425A Sereja and Swaps(暴力枚举)
题目链接:A. Sereja and Swaps 题意:给定一个序列,能够交换k次,问交换完后的子序列最大值的最大值是多少 思路:暴力枚举每一个区间,然后每一个区间[l,r]之内的值先存在优先队列内, ...
- codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
题目 这要学习的是如何枚举区间,vector的基本使用(存入,取出,排序等),这题的思路来自: http://www.tuicool.com/articles/fAveE3 //vector 可以用s ...
- Codeforces Round #243 (Div. 2)——Sereja and Table
看这个问题之前,能够先看看这个论文<一类算法复合的方法>,说白了就是分类讨论,可是这个思想非常重要 题目链接 题意: 首先给出联通块的定义:对于相邻(上下和左右)的同样的数字视为一个联通块 ...
- Codeforces Gym 100002 B Bricks 枚举角度
Problem B Bricks" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100002 ...
- codeforces C. Sereja and Swaps
http://codeforces.com/contest/426/problem/C 题意:找出连续序列的和的最大值,可以允许交换k次任意位置的两个数. 思路:枚举区间,依次把区间内的比较小的数换成 ...
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861B Which floor?【枚举,暴力】
B. Which floor? time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- Codeforces 626E Simple Skewness(暴力枚举+二分)
E. Simple Skewness time limit per test:3 seconds memory limit per test:256 megabytes input:standard ...
随机推荐
- 修改emlog表字段名称
在em_twitter表中增加一个字段. ,添加一个字段isImportant alter table em_twitter add isImprotant ) not ; ,把字段isImprota ...
- Html书写规范
#cnblogs_post_body ol { padding-left: 0px; } body { line-height: 1.6; } body, th, td, button, input, ...
- [译]AngularJS Service vs Factory - Once and for all
原文: http://blog.thoughtram.io/angular/2015/07/07/service-vs-factory-once-and-for-all.html Service和Fa ...
- js操作json与字符串相互转换
字符串转对象(strJSON代表json字符串) var obj = eval(strJSON); var obj = strJSON.parseJSON(); var obj = JSON.pars ...
- redhat 下 rpm 指令
1.如何安装rpm软件包rmp软件包的安装可以使用程序rpm来完成.执行下面的命令 rpm -i your-package.rpm 其中your-package.rpm是你要安装的rpm包的文件名,一 ...
- leofs存储总结
1.leofs角色 Account(账户).Bucket(对象桶).Object(对象), gateway.manager0.manager1.storage Account 一个account可以创 ...
- 【转】phpcms基础内容
<?php 思路: 一.目前在企业中使用比较多的cms内容管理有如下几种: 1.dedecms 2.phpcms 二.我们选择学习v9版本的phpcms,主要有以下几点原因: 1.基于MVC模式 ...
- Codeforces Round #292 (Div. 2) C. Drazil and Factorial
题目链接:http://codeforces.com/contest/515/problem/C 给出一个公式例如:F(135) = 1! * 3! * 5!; 现在给你一个有n位的数字a,让你求这样 ...
- 解压版MySQL安装说明
一.复制my.ini到MySQL解压的目录 例如:E:\MySQL 二.修改my.ini第39~40行 basedir = "E:\\MySQL" datadir = " ...
- tornado RequestHandler request.body & request.arguments
request.body , 请求的原始内容,post方式放在body中的. request.arguments, body参数和url参数的统一体, 同时也是经过“加工”,解码的. eg.在对接其他 ...