1165. 单词环


解题报告:这题可以用spfa判断正环的做法+二分来做,我们二分他的环的平均长度,看看能不能凑成环,如果暴力去把每个字符串变成一个点,总共会有1e5的点,可以优化一下,把整个字符串变成一条边,把前两个和后两个的单词字母映射成一个点,总共26*26个点,如果朴素去做会tle,那么要加个玄学优化,如果更新次数太多的话(十几倍左右)就暂且认为他是一个环,然后stl的queue太慢了,要用数组来模拟队列。

#include<bits/stdc++.h>
using namespace std;
const   int N=100010,M=700;
int h[M],e[N],ne[N],idx;
double w[N];
bool st[M];
int cnt[M];
double dist[M];
int q[N];
int n;
void add(int a,int b,int c)
{
   
    e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
bool check(double mid)
{
   
    memset(st, 0, sizeof st);
    memset(cnt, 0, sizeof cnt);
    int hh = 0, tt = 0;
    for (int i = 0; i < 676; i ++ )
    {
   
        q[tt ++ ] = i;
        st[i] = true;
    }
        int count=0;
    while(hh!=tt)
    {
   
        int t=q[hh++];
        if(hh==M)   hh=0;
        st[t]=false;
        for(int i=h[t];~i;i=ne[i])
    {
   
        int j=e[i];
        if(dist[j]<dist[t]+w[i]-mid)
        {
   
            dist[j]=dist[t]+w[i]-mid;
            cnt[j] = cnt[t]+1;
            if(!st[j])
            {
   
                st[j] = true;
                q[tt++]=j;
                if(tt==M)   tt=0;
            }
            if(cnt[j]>=M)   return true;
            if(++count>=10000)  return true; // 经验上的trick
        }
        
    }
    }
    return false;
}
int main()
{
   
    while(cin>>n,n)
   {
   
       idx=0;
      memset(h,-1,sizeof h);
    for(int i=0;i<n;i++)
    {
   
        string s;
        cin >> s;
        if(s.size()>=2)
       {
    int id = (s[0]-'a')*26 + (s[1]-'a');
        int id2=(s[s.size()-2]-'a')*26 + (s[s.size()-1]-'a');
        add(id,id2,s.size());
        }
    }
        double l=0,r=1e3;
        if(!check(0))
        cout<<"No solution"<<endl;
        else
       {
    
           while(r-l>1e-4)
        {
   
            double mid=(l+r)/2;
            if(check(mid))
            l=mid;
            else
            r=mid;
        }
        printf("%.2lf\n",l);
       }
        
   }
   return 0;
}
全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务