看这个问题之前,能够先看看这个论文《一类算法复合的方法》,说白了就是分类讨论,可是这个思想非常重要

题目链接

  • 题意:

    首先给出联通块的定义:对于相邻(上下和左右)的同样的数字视为一个联通块

    现给一个n*m的仅仅有0和1的矩形和数字k,求出最小反转个数使得总体包含若干个矩形联通块(即每一个联通块均是矩形)(1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10)

    假设最小次数比k大,输出-1
  • 分析:

    题目的特点是k比較小。也就是说反转的次数比較少,所以能够从这里入手。直接枚举全部的位置肯定是不行了,那么能够这样考虑:(最好还是设n>=m)假设n比k大,那么肯定有一些行是不会有反转的数字的,那么我们能够枚举每一行来处理;假设k比n大,这个时候n小于10,所以这时候我们就能够暴力枚举每一行的全部状态。然后处理。

    以上两种方法处理的时候均根据下边的图形特点,仅仅知道一行的时候就能够求出最小的总反转数

终于仅仅能是

01010...

10101...

...

的形状(当中一个字符代表一个矩形)

const int MAXN = 110;

int ipt[MAXN][MAXN];

int main()
{
// freopen("in.txt", "r", stdin);
int n, m, k;
while (~RIII(n, m, k))
{
REP(i, n) REP(j, m) RI(ipt[i][j]);
if (n < m)
{
REP(i, n) FF(j, i + 1, m) swap(ipt[i][j], ipt[j][i]);
swap(n, m);
}
if (n > k)
{
int ans = INF;
REP(i, n)
{
int tans = 0;
REP(j, n)
{
int cnt = 0;
if (i == j) continue;
REP(k, m)
{
if (ipt[i][k] != ipt[j][k]) cnt++;
}
tans += min(cnt, m - cnt);
}
ans = min(ans, tans);
}
printf("%d\n", ans <= k ? ans: -1);
}
else
{
int ans = INF;
REP(i, n)
{
int all = 1 << m;
for (int q = 0; q < all; q++)
{
int diff = 0;
for (int t = 0, l = 1; t < m; l <<= 1, t++) if (((q & l) != 0) != ipt[i][t]) diff++;
if (diff > k) continue;
int tans = 0;
REP(j, n)
{
if (i == j) continue;
int cnt = 0;
for (int t = 0, l = 1; t < m; t++, l <<= 1) if (((q & l) != 0) != ipt[j][t]) cnt++;
tans += min(cnt, m - cnt);
}
ans = min(ans, diff + tans);
}
}
printf("%d\n", ans <= k ? ans: -1);
}
}
return 0;
}

參照大神的代码后的一些细节改动:

const int MAXN = 110;

int ipt[MAXN][MAXN];

int main()
{
// freopen("in.txt", "r", stdin);
int n, m, k;
while (~RIII(n, m, k))
{
int ans = INF, all = 1 << m;
REP(i, n) REP(j, m) RI(ipt[i][j]);
if (n < m)
{
REP(i, n) FF(j, i + 1, m) swap(ipt[i][j], ipt[j][i]);
swap(n, m);
}
if (n > k)
{
REP(i, n)
{
int tans = 0;
REP(j, n)
{
int cnt = 0;
REP(k, m)
cnt += ipt[i][k] ^ ipt[j][k];
tans += min(cnt, m - cnt);
}
ans = min(ans, tans);
}
}
else
{
for (int mask = 0; mask < all; mask++)
{
int tans = 0;
REP(i, n)
{
int cnt = 0;
REP(j, m) cnt += ipt[i][j] ^ (mask >> j & 1);
tans += min(cnt, m - cnt);
}
ans = min(ans, tans);
}
}
printf("%d\n", ans <= k ? ans: -1);
}
return 0;
}

Codeforces Round #243 (Div. 2)——Sereja and Table的更多相关文章

  1. Codeforces Round #243 (Div. 2)——Sereja and Swaps

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012476429/article/details/24665103 题目链接 题意: 给定一个整数 ...

  2. Codeforces Round #243 (Div. 1)——Sereja and Two Sequences

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012476429/article/details/24798219 题目链接 题意:给两个长度分别 ...

  3. Codeforces Round #243 (Div. 1)——Sereja and Squares

    题目链接 题意: 给n个点,求能组成的正方形的个数. 四边均平行与坐标轴 大神的分析: 经典题 我们考虑每一种x坐标,显然仅仅有<= sqrt{N}个x坐标出现了> sqrt{N}次,我们 ...

  4. Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 解读

    http://codeforces.com/contest/426/problem/B 对称标题的意思大概是.应当指出的,当线数为奇数时,答案是线路本身的数 #include<iostream& ...

  5. Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力

    A. Sereja and Swaps time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. Codeforces Round #243 (Div. 2) C. Sereja and Swaps

    由于n比较小,直接暴力解决 #include <iostream> #include <vector> #include <algorithm> #include ...

  7. Codeforces Round #243 (Div. 2) B. Sereja and Mirroring

    #include <iostream> #include <vector> #include <algorithm> using namespace std; in ...

  8. Codeforces Round #243 (Div. 2) A. Sereja and Mugs

    #include <iostream> #include <vector> #include <algorithm> #include <numeric> ...

  9. Codeforces Round #243 (Div. 2) C. Sereja and Swaps(优先队列 暴力)

    题目 题意:求任意连续序列的最大值,这个连续序列可以和其他的 值交换k次,求最大值 思路:暴力枚举所有的连续序列.没做对是因为 首先没有认真读题,没看清交换,然后,以为是dp或者贪心 用了一下贪心,各 ...

随机推荐

  1. 论S B的自我修养 【2015/10/18更】

    to do list: 1.正则表达式引擎   (done 2.五子棋AI jquery && canvas 游戏 (这个搞定好多好玩的idea可以实现了php 暂时不想玩各种框架吧, ...

  2. android在JNI_OnLoad入口函数下断点动态调试so库

    一般来说,很多APK的校验代码,都会在程序运行的时候自动加载一些动态so库,然后执行这些库中的校验代码.所以为了能够通过程序的校验,我们必须在执行这些函数之前下断点——理想的方法就是在JNI_OnLo ...

  3. 《插件》一个比较好用的 chrome浏览器的json格式化插件

    插件名: JSON-Handle   下载地址:         http://jsonhandle.sinaapp.com/ 插件下载后,在浏览器输入:chrome://extensions/ 将下 ...

  4. nodeJS学习(5) --- sublime Text3 安装使用

    本节对对工具 sublime Text3 的安装进行简介. 主要参考网址:http://blog.csdn.net/sam976/article/details/52076271   http://w ...

  5. div 的相对定位与绝对定位

    网 上也有不少使用div + css进行布局的教程,却存在很多缺陷,一是对css的布局模型讲解不清楚,让人很难理解相对定位.浮动等概念:二是虽然避免了“表格套表格”的缺点,却 带来了“div 套 di ...

  6. Vijos P1404 遭遇战

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  7. .NET and php

    原文发布时间为:2011-12-29 -- 来源于本人的百度文章 [由搬家工具导入] http://www.php-compiler.net/blog/2011/phalanger-3-0

  8. 33个好用的图片轮显 jquery图片轮显

    原文发布时间为:2011-05-28 -- 来源于本人的百度文章 [由搬家工具导入] 我个人还是喜欢 jquery.recycle,比较通用。因为由美工设计好的轮显结构,如果套用下面,就感觉不是很方便 ...

  9. 【转】SqlCacheDependency的使用 强大的功能

    原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入]     最近我在忙于研究负载平衡、并发性容错性等性能优化问题,ASP.NET有太多强大的功能等待学习和挖掘。今天, ...

  10. 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...