Codeforces Round #243 (Div. 2)——Sereja and Table
来源:互联网 发布:数据挖掘预处理技术 编辑:程序博客网 时间:2024/05/21 20:29
看这个问题之前,可以先看看这个论文《一类算法复合的方法》,说白了就是分类讨论,但是这个思想很重要
题目链接
- 题意:
首先给出联通块的定义:对于相邻(上下和左右)的相同的数字视为一个联通块
现给一个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;}
8 0
- Codeforces Round #243 (Div. 2)——Sereja and Table
- Codeforces Round #243 (Div. 2)——Sereja and Swaps
- Codeforces Round #243 (Div. 1) B Sereja and Table
- Codeforces Round #243 (Div. 1)——Sereja and Squares
- Codeforces Round #243 (Div. 2)——A. Sereja and Mugs
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps
- Codeforces Round #243 (Div. 2)-C. Sereja and Swaps(multiset)
- Codeforces Round #243 (Div. 1)——Sereja and Two Sequences
- Codeforces Round #243 (Div. 1)——Sereja and Two Sequences
- Codeforces Round #223 (Div. 2)——B. Sereja and Stairs
- Codeforces Round #223 (Div. 2)——A. Sereja and Dima
- Codeforces Round #243 (Div. 1) A Sereja and Swaps
- Codeforces Round #243 (Div. 1) C Sereja and Two Sequences
- Codeforces Round #215 (Div. 2) -A. Sereja and Coat Rack
- Codeforces Round #215 (Div. 2) -B. Sereja and Suffixes
- Codeforces Round #215 (Div. 2) -B. Sereja and Suffixes
- Codeforces Round #215 (Div. 2) A. Sereja and Coat Rack
- Python 异常结构
- Oracle的备份与恢复exp\imp命令
- HDU 2047 阿牛的EOF牛肉串
- 关于fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突的解决办法
- POJ 2074 Line of Sight
- Codeforces Round #243 (Div. 2)——Sereja and Table
- Spring MVC_HandlerInterceptorAdapter的使用(不仅可实现Filter的所有功能,还可以更精确的控制拦截精度)
- 那年那些事~~
- mybatis显示sql语句 log4j.properties配置文件
- 最小值与最大值(第9章:中位数和顺序统计量)...2014.4.28
- DLX (精确覆盖) ZOJ 3209 Treasure Map
- 使用Python进行Web数据处理
- 进一步认识golang中的并发
- poj 1298 The Hardest Problem Ever