>  기사  >  웹 프론트엔드  >  Codeforces Round #243 (Div. 2)??Sereja and Table_html/css_WEB-ITnose

Codeforces Round #243 (Div. 2)??Sereja and Table_html/css_WEB-ITnose

WBOY
WBOY원래의
2016-06-24 12:05:28881검색

codeforces.com/contest/426/problem/D

  • 题意:
    首先给出联通块的定义:对于相邻(上下和左右)的相同的数字视为一个联通块
    现给一个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  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) continue;					int tans = 0;					REP(j, n)					{						if (i == j) continue;						int cnt = 0;						for (int t = 0, l = 1; t   <br>  <br>  <p></p> 
    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.