Word rings
Word rings
题目描述
这道题就是想求出所有的环,然后在所有环中比较出环串的平均长度最长的那一个,然后就输出平均长度最长的,如果在一个点当中的样例中没有环的话我们就应该输出“No Sulution.”
- 注意是No Sulution. 有句点,题目的翻译有一点问题在测试中数据有句点,在原文中也有句点
首先我们的思路应该是跑最长路,因为无论我们想求平均长度最长,我们肯定希望每一个都非常长,刚好边权为字符串长度,那么跑一下当正环出来之后就跑不出来了。但是这题数据太大了我们过不了
当我们首先用枚举环来求出答案士失败时那么我们接下来的思路应该是尝试枚举答案,然后求出是否有满足答案的环,但若我们此时枚举的答案为ans,有k个字符串,那么就有了这样一个式子ans∗k=len1+len2+len3+...+lenkans∗k=len1+len2+len3+...+lenk
在我们得到那道这个式子之后,我们对它进行必要的移项
len1−ans+len2−ans+len3−ans+...+lenk−ans=0
所以说我们可以得到对于满足以下式子,也可以判断是否是正环
0≤len1−ans+len2−ans+len3−ans+...+lenk−ans0
那么对于这个ans值,ans值越大,那么存在正环的概率也就越小,当ans值越小时,ans大的情况肯定也会包含在里面,这就保证了单调性,我们在确定这个方法的单调性之后我们就可以直接使用二分答案来做这道题了。
对于最长路的求解我们应该使用Dijkstra对此进行判断正环(因为Dijkstra不能处理负数情况,时间的复杂度比较低),但是我们也可以用SPFA来判正环(我们可以将每一条边的权值乘以负一),然后我们再加一个spfa优化就可以了。
补充
在这里讲一下如何进行缩点,在题目中我们不难发现对于一串字符串来说只有首尾的各两个数字是有用的,其他的字符我们可以忽略不计,但是我们学要用一下哈希来使我们的aa到zz中间的所有的字符不会冲突,(第一位可以乘以26,第二位用1到25表示,那么我们得到的那个数整除26的和然后再+1就代表第一个字符在a到z中的第几个位置,之后我们可以再用那个数模26然后再+1就代表第二个字符在a到z中的第几个位置)这样可以保证不会出现冲突了。
直接把一个字符串当中的首尾各两个字符变为两个点整个字符串的长度为我们的边权建立一条边这样就可以进行建边了,再执行之前的工作就可以work it out(解决)了
好题推荐
(spfa的优化的题目)
这些题可以帮助大家练习好spfa的优化的题目
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const double eps=1e-6;
int n;
char s[1005];
int ord(char a,char b) {//缩点(避免冲突)
return (a-'a')*26+b-'a';
}
int lnk[N],ne[N],la[N],co[N],tot;
double dis[N];
bool vis[N];
void add(int x,int y,int z) {
ne[++tot]=y;
co[tot]=z;
la[tot]=lnk[x];
lnk[x]=tot;
}
bool dfs(int x,double v) {//dfs版的spfa
vis[x]=1;
for(int j=lnk[x]; j; j=la[j]) {
if(dis[ne[j]]<dis[x]+co[j]-v) {
dis[ne[j]]=dis[x]+co[j]-v;
if(vis[ne[j]])return 1;
else {
if(dfs(ne[j],v))return 1;
}
}
}
vis[x]=0;
return 0;
}
bool check(double mid) {//判断是否是负环
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(int i=0; i<=5000; ++i)
if(dfs(i,mid))return 1;
return 0;
}
int main() {
while(cin>>n) {
memset(lnk,0,sizeof(lnk));
tot=0;
if(n==0){
return 0;
}
for(int i=1; i<=n; ++i) {
scanf("%s",s+1);
int l=strlen(s+1);
add(ord(s[1],s[2]),ord(s[l-1],s[l]),l);
}
double l=0,r=1005;
while(r-l>eps) {//进行二分答案求解
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
if(l==0)cout<<"No solution."<<endl;
else cout<<l<<endl;
}
}
Word rings的更多相关文章
- 【POJ2949】Word Rings(最大平均值环)
题意:给定N个字符串,如果A串的最后两个字母跟B串的前两个字母相同它们就能连接. 求一个由字符串组成的首尾相连的环,使(字符串总长度/字符串个数)最大. n<=100000 len<=10 ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- ACM一些题目
Low Power 先二分答案,可以通过调整证明同一台机器选的两个芯片必然是提供能量数值相邻的两个.所以再贪心一下就可以了. 时间复杂度\(O(n \log n)\). Factors 假设\(k\) ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- Word/Excel 在线预览
前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...
随机推荐
- 理解Django 中Call Stack 机制的小Demo
1.工作流程 request/response模式下,request并不是直接到达view方法,view方法也不是将返回的response直接发送给浏览器的,而是request由外到里的层层通过各种m ...
- PJSIP开发指南
一.通用设计 1.1 架构 1.1.1 通信图 下面的图展示了SIP消息在PJSIP组件间从后端到前端如何传递的. 1.1.2 类图 下面的图显示类视图 1.2 E ...
- 常用注解@Intdef与@Stringdef
1.优点 可以代替枚举,静态常量,可以让注解只在代码中存在,编译后就删除,可以省内存. 2.@IntDef 2.1 官网 https://developer.android.com/reference ...
- js扩展运算符(spread)三个点(...)
常见用法: 1.该运算符主要用于函数调用. function push(array, ...items) { array.push(...items); } function add(x, y) { ...
- unity 着色器内置宏
目标平台 Macro: Target platform: SHADER_API_D3D11 Direct3D 11 SHADER_API_GLCORE Desktop OpenGL “core” (G ...
- 想在java接口自动化里用上Python的requests?这样做就可以了
相信现在很多的公司自动化测试重点都在接口层,因为接口测试更加接近代码底层,相对于UI自动化,接口自动化有着开发更快.覆盖更全.回报率高等优点. 接口自动化代码实现不难,本质上就是代码模拟发送请求,然后 ...
- 给IE9及其以下等不支持classList属性的浏览器,添加classList属性
// 解决IE9及其以下 不支持classList属性的问题 if (!("classList" in document.documentElement)) { Object.de ...
- 详解 Python 的二元算术运算,为什么说减法只是语法糖?
原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...
- 字符串split的用法
拆分字符串:张三:20|李四:40|王五:40 这个可以使用两次分割,第一次使用 | 分割,放到arr数组里,然后使用循环对arr[i]进行使用:分割 public static void main( ...
- jenkins iOS自动打包
1.Jenkins配置 采用命令行下载配置Jenkins,防止产生权限问题 1)先安装brew,打开命令行,输入:/usr/bin/ruby -e "$(curl -fsSL https:/ ...