Zepto Code Rush 2014——Dungeons and Candies
- 题意:
k个点,每一个点都是一个n * m的char型矩阵。对与每一个点,权值为n * m或者找到一个之前的点,取两个矩阵相应位置不同的字符个数乘以w。找到一个序列,使得全部点的权值和最小 - 分析:
首先,这个图是一个无向图。求权值和最小,每一个权值相应的是一条边,且每一个点仅仅能有一个权值即一条边,一个k个边,和生成树非常像,可是须要证明不能有环形。最好还是如果如今有三个点,每一个点的最小边成环,这时候是不能找到一个序列使得每一个点都取到它的最小边值的,所以,k个点k个边不能有环且边值和最小,就是最小生成树。
const int maxn = 1100; char ipt[maxn][11][11];
int dist[maxn][maxn];
int d[maxn], p[maxn];
bool vis[maxn];
int n, m, k, w; int main()
{
// freopen("in.txt", "r", stdin);
while (~RIV(n, m, k, w))
{
CLR(dist, 0);
REP(i, k)
{
vis[i] = false;
d[i] = n * m;
p[i] = -1;
} REP(i, k) REP(j, n)
RS(ipt[i][j]);
REP(i, k) REP(j, k) REP(ii, n) REP(jj, m)
dist[i][j] += (ipt[i][ii][jj] != ipt[j][ii][jj]) * w;
d[0] = 0;
int sum = n * m;
VI ans;
REP(i, k)
{
int M = INF, ind;
REP(j, k)
if (!vis[j] && d[j] < M)
{
ind = j;
M = d[j];
}
vis[ind] = true;
sum += M;
ans.push_back(ind);
REP(j, k)
{
if (!vis[j] && dist[ind][j] < d[j])
{
d[j] = dist[ind][j];
p[j] = ind;
}
}
}
WI(sum);
REP(i, ans.size())
{
cout << ans[i] + 1 << ' ' << p[ans[i]] + 1 << endl;
}
}
return 0;
}
kruskal:
const int maxn = 1100; struct Edge
{
int from, to, dist;
int operator< (const Edge& rhs) const
{
return dist < rhs.dist;
}
Edge (int from = 0, int to = 0, int dist = 0)
{
this->from = from;
this->to = to;
this->dist = dist;
}
}; vector<Edge> G[maxn];
int in[maxn];
vector<Edge> edges;
int fa[maxn];
char ipt[maxn][105];
int diff[maxn][maxn];
int n, m, k, w;
int find(int n)
{
return (n == fa[n]) ? n : (fa[n] = find(fa[n]));
}
void init(int n)
{
REP(i, n)
{
fa[i] = i;
G[i].clear();
in[i] = 0;
}
edges.clear();
}
void AddEdge(int u, int v, int dist)
{
edges.push_back(Edge(u, v, dist));
}
void dfs(int u, int fa)
{
REP(i, G[u].size())
{
Edge& e = G[u][i];
if (e.to != fa)
{
if (e.dist == m * n)
cout << e.to + 1 << ' ' << 0 << endl;
else
cout << e.to + 1 << ' ' << u + 1 << endl;
dfs(e.to, u);
}
}
}
void solve()
{
int ret = 0;
sort(all(edges));
REP(i, edges.size())
{
Edge& e = edges[i];
int ru = find(e.from), rv = find(e.to);
if (ru != rv)
{
fa[ru] = rv;
ret += e.dist;
G[e.from].push_back(Edge(e.from, e.to, e.dist));
G[e.to].push_back(Edge(e.to, e.from, e.dist));
in[e.from]++;
in[e.to]++;
}
}
WI(ret + n * m);
REP(i, k)
{
if (in[i] <= 1)
{
cout << i + 1 << ' ' << 0 << endl;
dfs(i, -1);
break;
}
}
} int judge(int a, int b)
{
int cnt = 0;
REP(i, n * m)
cnt += (ipt[a][i] != ipt[b][i]);
return cnt;
} int main()
{
// freopen("in.txt", "r", stdin);
while (~RIV(n, m, k, w))
{
CLR(diff, 0);
REP(i, k)
{
int len = 0;
REP(j, n)
{
RS(ipt[i] + len);
len = strlen(ipt[i]);
}
}
REP(i, k) REP(j, k) REP(t, n * m)
diff[i][j] += (ipt[i][t] != ipt[j][t]);
init(k);
REP(i, k) REP(j, k)
{
if (i == j)
continue;
AddEdge(i, j, min(diff[i][j] * w, n * m));
}
solve();
}
return 0;
}
Zepto Code Rush 2014——Dungeons and Candies的更多相关文章
- Codeforces Zepto Code Rush 2014 -C - Dungeons and Candies
这题给的一个教训:Codeforces没有超时这个概念.本来以为1000*(1000+1)/2*10*10要超时的.结果我想多了. 这题由于k层都可能有关系,所以建一个图,每两个点之间连边,边权为n* ...
- CF Zepto Code Rush 2014 B. Om Nom and Spiders
Om Nom and Spiders time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Zepto Code Rush 2014 A. Feed with Candy
此题用贪心求解, 首先将caramel drop类别的糖果按照高度从小到大排序,如果高度相同,按照重量从小到大排序 将fruit drop类别的糖果按照高度从小到大排序,如果高度相同,按照重量从小到大 ...
- Zepto Code Rush 2014 B - Om Nom and Spiders
注意题目给的是一个nxm的park,设元素为aij,元素aij 有4种可能U(上移),D(下移),L(左移),R(右移) 假设第i行第j列元素aij(注意元素的索引是从0开始的) 当aij为D时,此时 ...
- Zepto Code Rush 2014-A. Feed with Candy(HACK)
A. Feed with Candy time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Dungeons and Candies
Zepto Code Rush 2014:http://codeforces.com/problemset/problem/436/C 题意:k个点,每个点都是一个n * m的char型矩阵.对与每个 ...
- Code Rush插件
code rush 是微软推出的一款VS2008上的插件.他有强大的文件和代码导航功能,易于访问的重构和代码创建功能.一组编辑器.选择.剪贴板工具等. 教程链接 http://www.devexpre ...
- ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力
C. Om Nom and Candies Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526 ...
- ZeptoLab Code Rush 2015 C. Om Nom and Candies [ 数学 ]
传送门 C. Om Nom and Candies time limit per test 1 second memory limit per test 256 megabytes input sta ...
随机推荐
- 分布式搜索elasticsearch 文献检索索引 入门
1.首先,例如,下面的数据被提交给ES该指数 {"number":32768,"singer":"杨坤","size": ...
- JNI 可变印刷
1.包log.h #ifndef __MULTI_TRACE_H__ #define __MULTI_TRACE_H__ #ifdef ANDROID_NDK_BUILD #define LOG_TA ...
- HDU 1061 Rightmost Digit解决问题的方法
求大量N^N的值最右边的数字,即最低位. 它将能够解决一个简单二分法. 只是要注意溢出,只要把N % 10之后.我不会溢出,代替使用的long long. #include <stdio.h&g ...
- 采用UltraISO制作U菜Win7安装盘,显现"File not find /BOOT/CDMENU.EZB.ezb"错误
一机公司Win7动力password不知道.这台机器也很慢, 刷新Win7,运用32位Ghost设备ISO档.从机U之后启动盘,演出 "File not find /BOOT/CDMENU. ...
- 【cocos2d-x】尝鲜 Cocos Code IDE(不断更新)
Cocos Code IDE 是一个基于 Eclipse 的跨平台 IDE ,专门为 cocos2d lua & js 开发者准备,通过此工具.你能够方便的创建游戏project.编写而且调试 ...
- 读书笔记之SQL注入漏洞和SQL调优
原文:读书笔记之SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“' ...
- android--jenkins+gradle+android自动化构建apk步骤(转)
第一步,安装jenkins,这个网上教程挺多的. 第二步,下载并配置gradle.下载地址http://www.gradle.org/ 解压gradle至某路径下,如/usr/local/lib/gr ...
- Android技术——切换视图(两)随着ViewPage达到Tab幻灯片浏览
Android技术--切换视图(一)~(四)在资源项目:https://github.com/YongYuIT/MeiNv_Liulanqi 一.早期android(android.support.v ...
- CSDN帐号被盗尚未?
总是早上登录CSDN,STIL.总是让C货币. 但是今天除了发C币,还提示我有2篇博文被删除了,打开看了看,原来不是我发的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- C++ tree(1)
建立与基本操作 .有关二叉树的相关概念,这里不再赘述,假设不了解二叉树相关概念,建议先学习数据结构中的二叉树的知识点 准备数据 定义二叉树结构操作中须要用到的变量及数据等. #define MAXLE ...