佳佳的魔法阵

背景

也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵。而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放……

描述

魔法阵是一个\(n \times m\)的格子(高n,宽m),\(n \times m\)为偶数。佳佳手中有\(n \times m\)个宝石(以\(1 \to n \times m\)编号)。佳佳从最右上角的格子开始走,从一个格子可以走到上、下、左、右4个相邻的格子,但不能走出边界。每个格子必须且仅能到过1次,这样佳佳一共走了\(n \times m\)个格子停止(随便停哪里)。佳佳每进入一个格子,就在该格子里放入一颗宝石。他是按顺序放的,也就是说——第i个进入的格子放入i号宝石。

如果两颗宝石的编号对\(\frac{n \times m}{2}\)取模的值相同,则认为这两颗宝石相互之间有微妙的影响。也就是说,我们按照宝石的编号对取\(\frac{n \times m}{2}\)模的值,将宝石分成\(\frac{n \times m}{2}\)对,其中每对都恰有两颗宝石。对于每一对宝石,设第一颗宝石在第a行第b列,另一颗宝石在第c行第d列,那么定义这2个宝石的魔力影响值为 $ k_1\times \left| a-c \right|+k_2 \times \left| b-d \right| $。

需要你求出的是,在所有合乎题意的宝石摆放方案中,所有成对的宝石间的最大魔力影响值的最小值为多少。换句话说,如果我们定义对\(\frac{n \times m}{2}\)取模的值为i的一对宝石的魔力影响值为\(a_i\)。你需要求出的就是\(\max{(a_i|i=0,1,2...)}\)的最小值。

输入格式

只有一行用空格隔开的4个整数,分别是\(n、m、k_1、k_2,n \times m \le 50,0<k_1,k_2 \le 32767\)。

输出格式

只需输出一个整数,即题目所要求的“所有成对的宝石间的最大魔力影响值的最小值”。

样例输入1

2 2 2 2

样例输出1

4

限制

1秒


思路

这是一道搜索+剪枝题。一看到数据范围(\(n \times m \le 50\))我便兴奋的飞起——暴搜!!!

然而没打完代码模拟赛就结束了。。。。。。

这道题的搜索的方式要一分为二(其实还是有很多重叠部分的),前 $ \frac{n \times m}{2}$ 一部分,剩下的一部分。

注意两个剪枝

  1. 最优化剪枝:很简单,当前最大值比ans大或者等于ans时直接return。
  2. 可行性剪枝:接下来仔细讲讲这个吧。

蓝色的点表示当前位置,红色的点表示访问过的位置。这种情况(左、右两点不能再访问而上下两点未访问)是一种不可行的情况。

为什么呢?

仔细想一想就能明白了。

以上述情况为例,蓝色点的上方或下方必定会构成死胡同。

像这样:

具体自己再理解理解吧。

然后上代码!

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 55 int n, m, k1, k2, ans(0x7f7f7f7f), nn;
int a[MAXN][2];
bool vis[MAXN][MAXN];
int dir[][2] = { 1, 0, 0, 1, -1, 0, 0, -1 }; bool check( int x, int y ){
if ( vis[x + 1][y] && vis[x - 1][y] && !vis[x][y + 1] && !vis[x][y - 1] ) return 0;
if ( vis[x][y + 1] && vis[x][y - 1] && !vis[x + 1][y] && !vis[x - 1][y] ) return 0;
return !vis[x][y];
} inline int ABS( int x ){
return x < 0 ? -x : x;
} inline int Get( int x, int y, int a, int b ){
return k1 * ABS( x - a ) + k2 * ABS( y - b );
} void DFS( int x, int y, int wh, int cur ){
if ( wh <= nn ) a[wh][0] = x, a[wh][1] = y;
else cur = max( cur, Get( x, y, a[wh - nn][0], a[wh - nn][1] ) ); if ( wh >= n * m ){
ans = min( ans, cur );
return;
}
if ( cur >= ans ) return; vis[x][y] = 1;
for ( int i = 0; i < 4; ++i ){
int tx( x + dir[i][0] ), ty( y + dir[i][1] );
if ( !check( tx, ty ) ) continue;
DFS( tx, ty, wh + 1, cur );
}
vis[x][y] = 0;
} int main(){
scanf( "%d%d%d%d", &n, &m, &k1, &k2 );
for ( int i = 0; i <= n + 1; ++i ) vis[i][0] = vis[i][m + 1] = 1;
for ( int i = 0; i <= m + 1; ++i ) vis[0][i] = vis[n + 1][i] = 1;
nn = n * m >> 1;
DFS( 1, m, 1, 0 );
printf( "%d\n", ans );
return 0;
}

秀一把 \(\LaTeX\) hahaha

「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵的更多相关文章

  1. 「Vijos 1282」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法照片

    佳佳的魔法照片 背景 佳佳的魔法照片(Magic Photo):如果你看过<哈利·波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为小魔法师佳佳长的太帅,很多人都找他要那种神奇的魔法 ...

  2. 「Vijos 1285」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法药水

    佳佳的魔法药水 背景 发完了k张照片,佳佳却得到了一个坏消息:他的MM得病了!佳佳和大家一样焦急万分!治好MM的病只有一种办法,那就是传说中的0号药水--怎么样才能得到0号药水呢?你要知道佳佳的家境也 ...

  3. 「Vijos 1283」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔杖

    佳佳的魔杖 背景 配制成功了珍贵的0号药水,MM的病治好了.轻松下来的佳佳意外的得到了一个好东西--那就是--一种非常珍贵的树枝.这些树枝可以用来做优质的魔杖!当然了,不能只做自己的,至少还要考虑到M ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  6. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  7. 「CSP-S模拟赛」2019第三场

    目录 T1 「POI2007」山峰和山谷 Ridges and Valleys 题目 考场思路(几近正解) 正解 T2 「JOI 2013 Final」 现代豪宅 题目 考场思路(正解) T3 「SC ...

  8. 「CSP-S模拟赛」2019第二场

    目录 T1 Jam的计数法 题目 考场思路(正解) T2 「TJOI / HEOI2016」排序 题目 考场思路(假正解) 正解 T3 「THUWC 2017」随机二分图 题目 考场思路 正解 这场考 ...

  9. 「CSP-S模拟赛」2019第一场

    目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) ...

随机推荐

  1. webpack详述

    一.利用package.json执行打包任务 首先使用npm init生成package.json文件:然后配置scripts如下: "scripts": { "buil ...

  2. RequestMapping中produces属性作用

    注解RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml: @RequestMapping(value="/xxx",prod ...

  3. hdu 4063 Aircraft (Geometry + SP)

    Problem - 4063 几何加简单最短路. 题意是给出若干圆的圆心以及半径,求出从给出的起点到终点的最短路径的长度,可以移动的区域是圆覆盖到的任意一个位置. 做法是这样的,对圆两两求交点,用这些 ...

  4. 解析xml的方式

    1.DOM 理论:将标记文档语言一次性加载进内存,在内存中形成DOM树. 优点:操作方便,可以对文档进行CRUD(增删改查)操作,适用于服务端操作 缺点:占内存,不适用与手机,智能家居等内存容量小的设 ...

  5. hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  6. SuperSocket通过本地证书仓库的证书来启用 TLS/SSL

    你也可以通过本地证书仓库的证书,而不是使用一个物理文件. 你只需要在配置中设置你要使用的证书的storeName和thumbprint: <server name="EchoServe ...

  7. 2019-7-29-PowerShell-拿到显卡信息

    title author date CreateTime categories PowerShell 拿到显卡信息 lindexi 2019-7-29 10:3:35 +0800 2019-02-21 ...

  8. vue样式加scoped后不能覆盖组件的原有样式解决方法

    <style scoped> </style> 为了vue页面样式模块化,不对全局造成污染,建议每个页面的style标签加上scoped,表示他的样式只属于当前的页面,父组件的 ...

  9. SELECT command denied to user 'username'@'ip' for table 'user'错误处理

    错误信息 使用RDS for MySQL,程序执行查询SQL时报错如下: SELECT command denied to user 'username'@'ip' for table 'user' ...

  10. 9月29更新美版T-mobile版本iPhone7代和7P有锁机卡贴解锁方法

    ​ T版是块难解的砖头,之前一直没有找到稳定解锁办法,经过多次不写努力和实验,终于解决 不管是用超雪卡贴还是GPP卡贴,第一次先用连接WIFI激活手机! 注意:一定不要用ICCID通用激活,或者是TM ...