HDU 4890 One to Four(2014 Multi-University Training Contest 3)
题意:给定一个长方形网格,要把它切成完全相同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)的更多相关文章
- hdu 5003 模拟水题 (2014鞍山网赛G题)
你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...
- 千寻浏览器 1.0 Beta 1(524)(2014年5月27日)
千寻浏览器--又一款新生浏览器今天进入各位浏览迷的视野.千寻浏览器基于IE内核,据传是由百度浏览器的上海团队操刀,在功能定位上,与目前的QQ浏览器有些相似. 千寻来自官方的解释:寻,追寻,探索,又是古 ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- ( 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 ...
- 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 ...
- HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)
题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能) ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- HDU - 3966 Aragorn's Story(树链剖分入门+线段树)
HDU - 3966 Aragorn's Story Time Limit: 3000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
随机推荐
- ios 开发之 Xcode6 No valid signing identities (i.e. certificate and private key pair) matching...
之前的项目用证书真机测试过,我想再无证书Build,出现下面的报错提示! 下面的team我无法改成None!一点击None选的还是Unhonw name(JPGE28K3W9)这个是报错的关键 最后由 ...
- IntelliJ IDEA 学习(六)内存设置
小伙伴们经常会发现,在开发的时候,经常遇到内存被占满,导致异常卡顿,有时候提示内存溢出,这时可以通过设置xmx来改善.不过切记最好不要超过内存的1/4 打开 IDEA 安装目录,看到有一个 bin 目 ...
- javascript js中的typeof使用
typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...
- Bootstrap段落(正文文本)
一.Bootstrap段落特点 段落是排版中另一个重要元素之一.在Bootstrap中为文本设置了一个全局的文本样式(这里所说的文本是指正文文本): 1.全局文本字号为14px(font-size). ...
- VI查找与替换
一.vi查找: 当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找, 不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出 ...
- 转!!java中Object转String
Object转为String的几种形式 在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString ...
- 检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
/** * Author: laixiangran. * Created by laixiangran on 2015/12/02. * 检测访问网页的浏览器呈现引擎.平台.Windows操作系统.移 ...
- 删除内容并不能删除field structure -- features_revert
把内容删了但field structure还在, 在manage_field界面,field还在.http://drupal.stackexchange.com/questions/21501/rev ...
- PHP 递归的密码
http://www.cnsecer.com/4146.html 说实话 真的很炫 好像还是不好理解啊
- VB的gdi+相关声明
模块: Option Explicit Public Declare Function GdiplusStartup Lib "gdiplus" (token As Long, i ...