luogu P2124 奶牛美容
首先数据范围那么小,那么算法也是相当暴力的。
对于一个点(x, y)所属的联通块,预处理出从这个点出发到这个块外的所有点的曼哈顿距离。复杂度O(n4)。
然后求答案:最少答案不一定是三个联通块两两相连,可能是两个联通块之间搭了个桥,然后第三个联通块连接在这个桥上。因此我们像floyd一样,枚举中间点,然后用dis[1][i][j] + dis[2][i][j] + dis[3][i][j]尝试更新答案。
刚开始我因为没有考虑到上面的情况,预处理出每一个点到其他联通块上的点的距离,然后排序,像最小生成树一样贪心取边。导致WA了几个点。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-;
const int maxn = ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) {last = ch; ch = getchar();}
while(isdigit(ch)) {ans = ans * + ch - ''; ch = getchar();}
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) x = -x, putchar('-');
if(x >= ) write(x / );
putchar(x % + '');
} int n, m;
char a[maxn][maxn];
int vis[maxn][maxn], cnt = ; const int dx[] = {-, , , }, dy[] = {, , , -};
void dfs(int x, int y, int flg)
{
vis[x][y] = flg;
for(int i = ; i < ; ++i)
{
int newx = x + dx[i], newy = y + dy[i];
if(newx > && newx <= n && newy > && newy <= m &&
a[newx][newy] == 'X' && !vis[newx][newy])
dfs(newx, newy, flg);
}
} int dis[][maxn][maxn], f[maxn][maxn];
void solve(int flg, int x, int y)
{
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
dis[flg][i][j] = min(dis[flg][i][j], abs(i - x) + abs(j - y));
} int main()
{
n = read(); m = read();
for(int i = ; i <= n; ++i) scanf("%s", a[i] + );
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
if(a[i][j] == 'X' && !vis[i][j])
dfs(i, j, ++cnt);
Mem(dis, 0x3f);
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
if(a[i][j] == 'X') solve(vis[i][j], i, j);
Mem(f, 0x3f);
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) if(a[i][j] == 'X')
{
f[vis[i][j]][] = min(f[vis[i][j]][], dis[][i][j]);
f[vis[i][j]][] = min(f[vis[i][j]][], dis[][i][j]);
f[vis[i][j]][] = min(f[vis[i][j]][], dis[][i][j]);
f[][vis[i][j]] = f[vis[i][j]][];
f[][vis[i][j]] = f[vis[i][j]][];
f[][vis[i][j]] = f[vis[i][j]][];
}
int ans = min(f[][] + f[][], min(f[][] + f[][], f[][] + f[][]));
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j)
ans = min(ans, dis[][i][j] + dis[][i][j] + dis[][i][j]);
write(ans - ); enter;
return ;
}
luogu P2124 奶牛美容的更多相关文章
- [洛谷P2124] 奶牛美容
洛谷题目链接:奶牛美容 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 6 16 ................ ..XXXX....XXX... ...XXXX... ...
- P2124 奶牛美容
题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 6 16 ................ ..XXXX....XXX... ...XXXX....XX... .XXXX ...
- [LuoguP2124]奶牛美容_bfs_floyd_曼哈顿距离
奶牛美容 题目链接:https://www.luogu.org/problem/P2124 数据范围:略. 题解: 发现数据范围只有$50$,显然可以直接$bfs$求出联通块,$floyd$求出相邻两 ...
- luogu P2345 奶牛集会
二次联通门 : luogu P2345 奶牛集会 /* luogu P2345 奶牛集会 权值线段树 以坐标为下标, 坐标为值建立线段树 对奶牛按听力由小到大排序 对于要查的牛 每次第i次放入奶牛起作 ...
- poj 3614 奶牛美容问题 优先队列
题意:每头奶牛需要涂抹防晒霜,其中有效的范围 min~max ,现在有L种防晒霜,每种防晒霜的指数为 f 瓶数为 l,问多少只奶牛可以涂上合适的防晒霜?思路: 优先队列+贪心 当奶牛的 min< ...
- luogu P2345 奶牛集会 |排序+树状数组
题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为X ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- luogu P1578 奶牛浴场
很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...
- POJ 3614 Sunscreen (优先队列)
题意:奶牛美容:有C头奶牛日光浴,每头奶牛分别需要minSPF_i和maxSPF_i单位强度之间的阳光.现有L种防晒霜,分别能使阳光强度稳定为SPF_i,其瓶数为cover_i.求最多满足多少头奶牛 ...
随机推荐
- Ansible 命令相关模块command, shell, raw, expect, script, telnet[转]
本文主要介绍Ansible的几个命令模块,包括: command - 在远程节点上执行命令 shell - 让远程主机在shell进程下执行命令 script - 将本地script传送到远程主机之后 ...
- Angular4+NodeJs+MySQL 入门-02 MySql操作类
NodeJs操作MySQL类 此类封装了几个常用的方法:插入,更新,删除,查询,开启事务,事务提交,事务回滚等操作.有一这个类,操作MYSQL就方便多了. 批处理,存储过程等方法还没有添加,因为觉得目 ...
- opengl键盘回调函数不能获取Ctrl+c的问题
我要令窗口在按下 Ctrl+c 之后关闭. 关键代码如下: /* 这段代码位于键盘回调函数中 */ if ((glutGetModifiers() == GLUT_ACTIVE_CTRL) & ...
- groovy与javah互相调用
暂时只找到这几种方法.groovy代码方便灵活.常用来写一些工具.一般都是java加入groovy代码 第一种 java中加入 groovy代码就是 Toy.groovy class Toy{ def ...
- js event鼠标事件
1,鼠标焦点事件 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- (四)selenium打开和关闭浏览器
一.Selenium简介 Selenium3.0主要变更特性: ①移除seleniumRC ②FireFox和Safari推出了自己的driver(geckodriver 和 Safaridriver ...
- java poi reader常用API汇总
注意:(1)判断行的最大数量建议使用sheet.getLastRowNum();(2)判断每行最大列数建议使用row.getLastCellNum(); [JAVA]特别注意,POI中getLastR ...
- 阿里巴巴国际站 网站和PC客户端都登录不了,其他电脑或手机可以
背景 昨天晚上,我还能打开阿里巴巴国际站,PC客户端也可以登录 今天早上起床打开电脑,发现国际站的网站打开不了,客户端也登录不了,提示了错误信息,但是其他电脑或手机就可以登录 原因分析 1.是不是本机 ...
- Csharp:操作存儲過程輸出參數,和返回值
/// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...
- 数据分析核心包——pandas
一.pandas简介 pandas是一个强大的Python数据分析的工具包,是基于NumPy构建的. 1.pandas的主要功能 (1)具备对其功能的数据结构DataFrame.Series (2)集 ...