zoukankan      html  css  js  c++  java
  • LOJ10082

    题目描述

    原题来自:Centrual Europe 2005

    我们有N个字符串,每个字符串都是由 a 至 z 的小写英文字母组成的。如果字符串A的结尾两个字符刚好与字符串B的开头两个字符匹配,那么我们称A与B能够相连(注意:A能与B相连不代表B能与A相连)。我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。如下例:

    ababc
    bckjaca
    caahoynaab

    第一个串能与第二个串相连,第二个串能与第三个串相连,第三个5+7+10=22(重复部分算两次),总共使用了3个串,所以平均长度是22/3=7.33

    输入格式
    本题有多组数据。

    每组数据的第一行,一个整数N,表示字符串数量;
    接下来N行,每行一个长度小于等于1000的字符串。

    读入以0结束。

    输出格式
    若不存在环串,输出 No solution,否则输出最长的环串的平均长度。

    只要答案与标准答案的差不超过0.01,就视为答案正确。

    样例
    样例输入
    3
    intercommunicational
    alkylbenzenesulfonate
    tetraiodophenolphthalein
    0
    样例输出
    21.66
    数据范围与提示
    对于全部数据,1<=N<=10^5。

    _____________________________________________________________________

    相同的题目还有LOJ10084

    二分答案+dfs_spfa

    平均长度最大,那么二分这个长度。让所有的边减去这个长度。然后判断是否存在正环。

    注意:

    bool pd(double x)
    {
    	memset(vis,0,sizeof vis);
    	memset(dis,0,sizeof dis);
    	for(int i=1;i<maxn;++i)
    	{
    		if(spfa(i,x))return 1;
    	}
    		return 0;
    }
    

      判断一个长度时,多次spfa,不需要进行多次初始化。

    _____________________________________________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=705;
     4 const int maxm=1e5+10;
     5 struct edge
     6 {
     7     int u,v,nxt;
     8     double w,ww;
     9 }e[maxm];
    10 int head[maxn],js;
    11 void addage(int u,int v,int w)
    12 {
    13     e[++js].u=u;e[js].v=v;e[js].w=w;
    14     e[js].nxt=head[u];head[u]=js;
    15 }
    16 char s[1010];
    17 int n;
    18 bool vis[maxn];
    19 double dis[maxn];
    20 bool spfa(int u,double x)
    21 {
    22     vis[u]=1;
    23     for(int i=head[u];i;i=e[i].nxt)
    24     {
    25         int v=e[i].v;
    26         if(dis[v]<dis[u]+e[i].w-x)
    27         {
    28             dis[v]=dis[u]+e[i].w-x;
    29             if(vis[v])return 1;
    30             if(spfa(v,x))return 1;
    31         }
    32     }
    33     vis[u]=0;    
    34     return 0;
    35 }
    36 bool pd(double x)
    37 {
    38 //    for(int i=1;i<=n;++i)e[i].ww=e[i].w-x;
    39     memset(vis,0,sizeof vis);
    40     memset(dis,0,sizeof dis);
    41     for(int i=1;i<maxn;++i)
    42     {
    43         
    44         if(spfa(i,x))return 1;
    45     }
    46         return 0;
    47 }
    48 int main()
    49 {
    50     while(scanf("%d",&n)==1)
    51     {
    52         if(n==0)break;
    53         double rr=0;
    54         memset(head,0,sizeof head);
    55         js=0;
    56         for(int u,v,w,i=0;i<n;++i)
    57         {    
    58             
    59             scanf("%s",s);
    60             w=strlen(s);
    61             if(w<2)continue;
    62             rr=rr>w?rr:w;
    63             u=(s[0]-'a')*26+s[1]-'a'+1;
    64             v=(s[w-2]-'a')*26+s[w-1]-'a'+1;
    65             addage(u,v,w);
    66         }
    67         double l=0,r=rr+0.00001,ans=-1;
    68         while(r-l>0.000001)
    69         {
    70             double mid=(l+r)/2;
    71             if(pd(mid))ans=mid,l=mid;
    72             else r=mid;
    73         }
    74         if(ans==-1)puts("No solution");
    75         else printf("%.4lf
    ",ans);
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    让Dreamweaver支持cshtml (MVC Razor环境)
    href="#"与href="javascript:void(0)"的区别
    ASP.NET MVC 4 中Razor 视图中JS无法调试 (重要)
    03011_HttpServletRequest
    1004. 成绩排名 (20)
    1003. 我要通过!(20)
    C语言文件读写命令fprintf和fscanf
    1002. 写出这个数 (20)
    1001. 害死人不偿命的(3n+1)猜想 (15)
    汇编in和out实例解析
  • 原文地址:https://www.cnblogs.com/gryzy/p/10578311.html
Copyright © 2011-2022 走看看