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.求最多满足多少头奶牛 ...
随机推荐
- spring初始化bean的目的
初始化bean就是为了将所有需要的bean全部装载到容器里面,等我们需要用到哪个bean就将哪个bean从容器里面拿出来
- linux命令行下的操作的快捷键
历史相关命令 命令 含义!! 执行上一条命令!num 执行历史命令中的第num条命令!-n ...
- 岛屿问题求最短路径(DFS)
用1代表陆地,用0代表陆地,你可以上下左右移动,给出下面这张地图求出最短路径 0101100001101001010110000 #include <iostream> #include ...
- Smart3D基础理论
目录: 1. Smart3D发展进程 2. 硬件要求与建模原理 3. Smart3D建模优势 4.Smart3D的应用领域 5. Smart3D的软件组成 6. Samrt3D主控台概述 1. Sma ...
- zstu 4212 ——String Game ——————【字符串处理】
4212: String Game Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 337 Solved: 41 Description Alice a ...
- http状态代码含义收藏
状态代码(也称作错误代码),指为服务器所接收每个请求(网页点击)分配的 3 位数代码.多数有效网页点击都有状态代码 200("正常")."网页未找到"错误会生产 ...
- jqGrid 将行变成超连接时浏览器解析超连接错误
1.将行变成超连接如下所示 name: , align: "center", formatter: function (cellValue, options, rowdata, a ...
- link快捷方式
ln -s 源文件 newfile -软连接 ln 源文件 newfile 硬链接 源文件删除之后仍然可以使用
- IE9下JQuery发送ajax请求失效
最近在做项目的时候,测试PC端网页,在IE9下会失效,不能正常的发送POST请求,经过仔细的排查,发现是IE9下JQuery发送ajax存在跨域问题. 目前有两种解决方案: 解决方案一: 设置浏览 ...
- 2017 年 9 月 27 日 js(文本框内容添加到select)
写法 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...