题意:给定一个长方形网格,要把它切成完全相同4个部分(这里完全相同指可以旋转平移后能重叠)。把4个重叠后每个网格对应有四个数字相加,得到一种方案,所有格子中和最小就是该种方案的值,在多种方案中,最后问最大的解能使多少。

思路:首先任意一种划分可以映射到4个相同的长方形, 也就是说一种不是长方形的方案 可以转化为一种长方形的。那么我们就只需要找4个完全相同的长方形就可以。一共有以下画法:

下面画图时基于n>m。边长要满足一定条件要自己注意。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define debug(x) printf(#x"= %d\n",x);
using namespace std;
struct node {
int a[][];
int n, m;
void rota() {//旋转90度
int b[][];
for (int i = ; i < n; ++i) {
for (int j = ; j < m; ++j) {
b[j][n - i - ] = a[i][j];
}
}
swap(n, m);
for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j)
a[i][j] = b[i][j];
}
} p[], s;
int a[][];
int n, m;
int ans;
node cur[];
void gao(int now) {
if (now == ) {
for (int i = ; i < ; ++i)
if (cur[i].n != cur[i + ].n || cur[i].m != cur[i + ].m)
return; int minn = ;
for (int i = ; i < cur[].n; ++i) {
for (int j = ; j < cur[].m; ++j) {
int sum = ;
for (int k = ; k < ; ++k) {
sum += cur[k].a[i][j];
}
// printf("%d %d %d\n",i,j,sum);
if (sum < minn)
minn = sum;
}
}
if (minn > ans)
ans = minn; return;
}
cur[now] = p[now];
gao(now + );
for (int i = ; i < ; ++i) {
cur[now].rota();
gao(now + );
}
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j)
scanf("%d", &a[i][j]);
//debug(m);
ans = ;
if (n % == ) {
for (int i = ; i < ; ++i) {
for (int j = n / * i; j < n / * (i + ); ++j) {
for (int k = ; k < m; ++k) {
p[i].a[j % (n / )][k] = a[j][k];
}
}
p[i].n = n / ;
p[i].m = m;
}
gao();
} if (m % == ) {
for (int i = ; i < ; ++i) {
for (int j = ; j < n; ++j) {
for (int k = i * (m / ); k < (i + ) * m / ; ++k) {
p[i].a[j][k % (m / )] = a[j][k];
}
}
p[i].n = n;
p[i].m = m / ;
}
gao();
} if (n % == && m % == ) {
for (int i = ; i < ; ++i) {
for (int j = (i / ) * n / ; j < (i / + ) * n / ; ++j) {
for (int k = (i % ) * m / ; k < (i % + ) * m / ;
++k) {
p[i].a[j % (n / )][k % (m / )] = a[j][k];
}
}
p[i].n = n / ;
p[i].m = m / ;
}
gao();
} s.n = n;
s.m = m;
for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j)
s.a[i][j] = a[i][j];
if (n < m) {
s.rota();
swap(n, m);
}
if ( * s.n == * s.m && s.m % == && s.n % == ) {
for (int i = ; i < ; ++i) {
for (int j = ; j < m; ++j) {
for (int k = i * m / ; k < (i + ) * m / ; ++k) {
p[i].a[j][k % (m / )] = s.a[j][k];
}
}
p[i].n = m;
p[i].m = m / ;
}
for (int i = m; i < n; ++i)
for (int j = ; j < m; ++j)
p[].a[i - m][j] = s.a[i][j];
p[].n = n - m;
p[].m = m;
gao(); for (int i = ; i < ; ++i) {
for (int j = n - m; j < n; ++j) {
for (int k = i * m / ; k < (i + ) * m / ; ++k) {
p[i].a[j - (n - m)][k % (m / )] = s.a[j][k];
}
}
p[i].n = m;
p[i].m = m / ;
}
for (int i = ; i < n - m; ++i)
for (int j = ; j < m; ++j)
p[].a[i][j] = s.a[i][j];
p[].n = n - m;
p[].m = m;
gao();
} if (s.n == * s.m && s.m % == ) {
for (int i = ; i < n / ; ++i)
for (int j = ; j < m / ; ++j)
p[].a[i][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = ; i < n / ; ++i)
for (int j = m / ; j < m; ++j)
p[].a[i][j - m / ] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = n / ; i < n / * ; ++i)
for (int j = ; j < m; ++j)
p[].a[i - n / ][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m;
for (int i = n / * ; i < n; ++i)
for (int j = ; j < m; ++j)
p[].a[i - n / * ][j] = s.a[i][j];
p[].n = n / ;
p[].m = m;
gao(); for (int i = n / ; i < n / * ; ++i)
for (int j = ; j < m / ; ++j)
p[].a[i - n / ][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = n / ; i < n / * ; ++i)
for (int j = m / ; j < m; ++j)
p[].a[i - n / ][j - m / ] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = ; i < n / ; ++i)
for (int j = ; j < m; ++j)
p[].a[i][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m;
for (int i = n / * ; i < n; ++i)
for (int j = ; j < m; ++j)
p[].a[i - n / * ][j] = s.a[i][j];
p[].n = n / ;
p[].m = m;
gao(); for (int i = n / ; i < n; ++i)
for (int j = ; j < m / ; ++j)
p[].a[i - n / ][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = n / ; i < n; ++i)
for (int j = m / ; j < m; ++j)
p[].a[i - n / ][j - m / ] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m / ;
for (int i = ; i < n / ; ++i)
for (int j = ; j < m; ++j)
p[].a[i][j] = s.a[i][j];
p[].n = s.n / ;
p[].m = s.m;
for (int i = n / ; i < n / ; ++i)
for (int j = ; j < m; ++j)
p[].a[i - n / ][j] = s.a[i][j];
p[].n = n / ;
p[].m = m;
gao(); }
printf("%d\n", ans); }
return ;
}

HDU 4890 One to Four(2014 Multi-University Training Contest 3)的更多相关文章

  1. hdu 5003 模拟水题 (2014鞍山网赛G题)

    你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...

  2. 千寻浏览器 1.0 Beta 1(524)(2014年5月27日)

    千寻浏览器--又一款新生浏览器今天进入各位浏览迷的视野.千寻浏览器基于IE内核,据传是由百度浏览器的上海团队操刀,在功能定位上,与目前的QQ浏览器有些相似. 千寻来自官方的解释:寻,追寻,探索,又是古 ...

  3. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  4. ( 2018 Multi-University Training Contest 2)

    2018 Multi-University Training Contest 2) HDU 6311 Cover HDU 6312 Game HDU 6313 Hack It HDU 6314 Mat ...

  5. HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 Problem Description There is an old country and ...

  6. HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)

    题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能)   ...

  7. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

  8. HDU - 3966 Aragorn's Story(树链剖分入门+线段树)

    HDU - 3966 Aragorn's Story Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  9. UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

随机推荐

  1. Python学习(5)条件语句

    目录 Python 条件语句 Python 简单的语句组 Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了 ...

  2. mysql 聚集函数和分组

    1.sc表的内容如下:mysql> select * from sc order by sid asc;+----+-------+-----+-------+| ID | SID | CID ...

  3. vim的配置文件及常用的快捷键

    一些最简单的配置,即在.vimrc中可以写入的配置: 首先,说明一点,在.vimrc文件中,可以用“  把一行的配置注销掉. set nocompatible  “关闭 vi 兼容模式:其中 comp ...

  4. 3 javascript

    3 javascript javascript基础 html: 负责了一个页面的结构.   css: 负责了一个页面的样式.    javascript: 负责与用户进行交互. 1997年欧洲的计算机 ...

  5. 原!!tomcat7.0 配置数据库连接池 SQLServer2000

    SQLServer2000所需的3个驱动jar包 msbase.jarmssqlserver.jarmsutil.jar 放入WEB-INF lib文件夹中 1.META-INF 创建一个contex ...

  6. No resource found that matches the given name 'Theme.AppCompat.Light'

    eclipse在新建andorid工程的时候出现找不到AppCompat.Light主题的问题,这是因为缺少支持低版本的v7包所致, 这个不是jar包,在sdk的extras->andorid- ...

  7. 获取AVCaptureSession samplebuffer 一像素的 rgb值

    获取AVCaptureSession samplebuffer 一像素的 rgb值 typedef unsigned char byte; typedef struct RGBPixel{ byte ...

  8. libCEF总结02字符串

    libCEF 的 CefString.cef_string_t 在 Windows 下均表示一个 16 位的 Unicode 字符串,它们的使用请参考下面的代码 {//wchar_t* ==> ...

  9. Java 创建xml文件和操作xml数据

    java中的代码 import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; ...

  10. Unity3D WebCamTexture 调用外部摄像头

    http://www.itnose.net/detail/6259004.html 一:Unity 中使用WebCamTexture 调用摄像头实现拍照和摄像. using UnityEngine; ...