博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF GYM 100703A Tea-drinking
阅读量:4687 次
发布时间:2019-06-09

本文共 1369 字,大约阅读时间需要 4 分钟。

题意:龙要制作n个茶,每个茶的配方是一个字符串,两个字符串之间有一个差值,这个差值为两个字符串每个对应字母之间差的绝对值的最大值,求制作所有茶时获得的所有差值中的最大值。

 

解法:克鲁斯卡尔。将茶的配方作为点,将每两个点之间的差值作为边权,求最小生成树,这棵树中最大的边即为答案。

 

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long longusing namespace std;string s[1005];int cal(int i, int j){ int res = 0; for(int k = 0; k < s[i].size(); k++) res = max(res, abs(s[i][k] - s[j][k])); return res;}struct node{ int u, v; int val; node(int u, int v, int val) : u(u), v(v), val(val) {} node() {} bool operator < (const node &tmp) const { return val < tmp.val; }};vector
edge;int father[1005];int Find(int a){ if(a != father[a]) father[a] = Find(father[a]); return father[a];}int main(){ int n, m; while(~scanf("%d%d", &n, &m)) { for(int i = 0; i < 1005; i++) father[i] = i; for(int i = 0; i < n; i++) { cin >> s[i]; } for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) { edge.push_back(node(i, j, cal(i, j))); } int ans = 0; sort(edge.begin(), edge.end()); int len = edge.size(); for(int i = 0; i < len; i++) { int a = Find(edge[i].u), b = Find(edge[i].v); if(a != b) { father[a] = b; ans = edge[i].val; } } printf("%d\n", ans); } return 0;}

  

转载于:https://www.cnblogs.com/Apro/p/4685997.html

你可能感兴趣的文章
POJ 2378 Tree Cutting(树形DP,水)
查看>>
第二冲刺阶段个人博客5
查看>>
UVA 116 Unidirectional TSP (白书dp)
查看>>
第三方测速工具
查看>>
MySQL 网络访问连接
查看>>
在aws ec2上使用root用户登录
查看>>
数据访问 投票习题
查看>>
CIO知识储备
查看>>
cnblog!i'm coming!
查看>>
使用点符号代替溢出的文本
查看>>
Axios 中文说明
查看>>
fatal: remote origin already exists.
查看>>
gridview 自定义value值
查看>>
2018二月实现计划成果及其三月规划
查看>>
封装springmvc处理ajax请求结果
查看>>
tyvj P2018 「Nescafé26」小猫爬山 解题报告
查看>>
类名.class和getClass()区别
查看>>
开发脚本自动部署及监控
查看>>
JavaScript--语句
查看>>
12/17面试题
查看>>