题意:给定一个长方形网格,要把它切成完全相同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类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

  2. pl/sql developer执行光标所在行

    一.发现问题 需要执行某一行语句时,需要选中该行语句,点击F8才行. 二.解决问题 中文版:工具->首选项->SQL窗口->自动选择语句 英文版:tools->preferen ...

  3. mybatis动态sql中where标签的使用

    where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的,如下所示: <select id="selectByParams&qu ...

  4. Html表单的正则校验--将不符合指定正则表达式的字符串自动替换为空

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. 转 java List 与ArrasyList 区别

    转 List是一个接口,而ListArray是一个类, ListArray继承并实现了List. 为什么要用 List list = new ArrayList() ,而不用 ArrayList al ...

  6. table和div设置height:100%无效的完美解决方法

    刚接触网页排版的新手,常出现这种情况:设置table和div的高height="100%"无效,使用CSS来设置height:"100%"也无效,为什么会这样呢 ...

  7. 关于MySQL大牛周振兴的博客

    博客内容比较丰富 MySQL管理 数据恢复 linux TCP 个人生活感触 不过内容总体是笔记式的,更适合自己看,不适合初学者去follow.不过对MySQL比较熟悉的人,可以看看,作为扩展眼界的途 ...

  8. maven 添加支持编译jdk1.7

     1.在<profiles>元素内增加如下内容   <profile>     <id>jdk17</id>     <activation> ...

  9. Azure 云平台用 SQOOP 将 SQL server 2012 数据表导入 HIVE / HBASE

    My name is Farooq and I am with HDinsight support team here at Microsoft. In this blog I will try to ...

  10. github如何pull最新代码

      github现在已经经常用了,但是经常遇到下面的问题 比如:从一个项目A中fork了一个分支B,并且在分支B有了改动.过了几天后,项目A中的代码应该会有很多人提交修改了,现在想将最新的代码pull ...