我們有 n 個字串,每個字串都是由 a∼z 的小寫英文本母組成的。
如果字串 a 的結尾兩個字元剛好與字串 b 的開頭兩個字元相匹配,那麼我們稱 a 與 b 能夠相連(注意:a 能與 b 相連不代表 b 能與 a 相連)。
我們希望從給定的字串中找出一些,使得它們首尾相連形成乙個環串(乙個串首尾相連也算),我們想要使這個環串的平均長度最大。
如下例:
ababc
bckjaca
caahoynaab
第乙個串能與第二個串相連,第二個串能與第三個串相連,第三個串能與第乙個串相連,我們按照此順序相連,便形成了乙個環串,長度為 5+7+10=22(重複部分算兩次),總共使用了 3 個串,所以平均長度是 223≈7.33。
輸入格式
本題有多組資料。
每組資料的第一行,乙個整數 n,表示字串數量;
接下來 n 行,每行乙個長度小於等於 1000 的字串。
讀入以 n=0 結束。
輸出格式
若不存在環串,輸出」no solution」,否則輸出最長的環串的平均長度。
只要答案與標準答案的差不超過 0.01,就視為答案正確。
資料範圍
1 ≤n
≤105
1≤n≤105
1≤n≤10
5輸入樣例:
3intercommunicational
alkylbenzenesulfonate
tetraiodophenolphthalein
0輸出樣例:
21.66
先說結論叭,當進入了大於2n次的時候(或者一直進乙個環那麼大概率是存在負環)
其次就是建圖的事了。我們首先可以考慮的是每個單詞連線一條邊,那麼我們最後兩個單詞組合有576種可能,如果所有單詞都一樣有100000條邊,100000個點。這顯然是爆掉的。因為我們只考慮開頭兩個單詞和結尾兩個單詞,所以我們把乙個單詞拆成兩個點,邊權是單詞長度。這樣的話我們點數就降到了576個點,100000條邊了,加上定理優化是可以接受的。接下來就是01分數規劃的問題,這裡就不化簡演示了,化簡和上一題一模一樣可以去看看,只不過是將點權加到邊權上的時候點權是1而已。然後我們答案肯定是0到1000,左開右閉。根據表示式:邊權之和-mid點權之和》0,當我們m等於0的時候左邊表示式最大,如果這個時候都小於等於0則無解。
#include
using
namespace std;
const
int n=
700;
const
int m=
1e7+7;
int ne[m]
,e[m]
,w[m]
,head[m]
,cnt,vis[n]
,con[n]
;int n;
double dis[n]
;void
add(
int a,
int b,
int c)
bool
spfa
(double mid)
int count=0;
while
(!q.
empty()
)}}}
return0;
}int
main()
; cnt=0;
memset
(head,-1
,sizeof head)
;for
(int i=
1;i<=n;i++)if
(!spfa(0
))puts
("no solution");
else
cout<}
jzoj3852 單詞接龍 0 1分數規劃,負環
n nn個單詞串,頭尾有兩個相同單詞就可以連在一起,求乙個最長的環使得平均單詞長度最長。其實總共26 26 26 26 26 2 6個點,然後求乙個迴路使得平均邊長最長 就是0 1分數規劃問題 二分乙個答案mid midmi d,將邊權改為mid w mid w mid w,然後跑負環判斷即可。in...
0 1分數規劃
題目鏈結 中文鏈結 附一篇大佬部落格感覺講的不錯 0 1分數規劃,不妨設 l a i b i 題目要求要讓結果最大,那麼就是l最大最終移相化簡可得 a i l b i 0,因為a 和b都是已知所以我們可以直接列舉l,當我們所求的值大於零說明l還有更優解當小於零時l沒有最優解。直接二分即可 inclu...
01分數規劃
01分數規劃,就是這樣乙個東西 max frac 其中 xi in 簡而言之,就是在n個物品中選出任意幾個 或者可以有限制選多少個 使得其兩種權值a,b的比值最大 這樣的問題可以二分解決 假如有這樣一道裸題 poj2976,選n k個物品使得比值最大 我們二分出r,若存在 frac r 則r可行 變...