3.小澳的葫蘆
(calabash.cpp/c/pas)
【題目描述】
小澳最喜歡的歌曲就是《葫蘆娃》。
一日表演唱歌,他盡了洪荒之力,唱響心中聖歌。
隨之,小澳進入了葫蘆世界。
葫蘆世界有n個葫蘆,標號為1~ n。n個葫蘆由m條藤連線,每條藤連線了兩個葫蘆,這些藤構成了一張有向無環圖。小澳爬過每條藤都會消耗一定的能量。
小澳站在1號葫蘆上(你可以認為葫蘆非常大,可以承受小澳的體重),他想沿著藤爬到n號葫蘆上,其中每個葫蘆只經過一次。
小澳找到一條路徑,使得消耗的能量與經過的葫蘆數的比值最小。
【輸入格式】
輸入檔名為calabash.in。
輸入檔案第一行兩個正整數n,m,分別表示葫蘆的個數和藤數。
接下來m行,每行三個正整數u,v,w,描述一條藤,表示這條藤由u連向v,小澳爬過這條藤需要消耗w點能量。
【輸出格式】
輸出檔名為calabash.out。
一行乙個實數,表示答案(誤差不超過 10^-3)。
【輸入輸出樣例】
calabash.in
calabash.out
4 61 2 1
2 4 6
1 3 2
3 4 4
2 3 3
1 4 8
2.000
【輸入輸出樣例說明】
有4種爬法:
1->4,消耗能量8,經過2個葫蘆,比值為8/2=4。
1->2->4,消耗能量1+6=7,經過3個葫蘆,比值為7/3≈2.33。
1->3->4,消耗能量2+4=6,經過3個葫蘆,比值為6/3=2。
1->2->3->4,消耗能量1+3+4=8,經過4個葫蘆,比值為8/4=2。
所以選第三種或第四種方案,答案為2。
【資料規模與約定】
測試點編號nm
特殊說明12
1210099
除1外,所有葫蘆的入度均為1
3100
105所有從1到n的路徑經過的葫蘆數相等
4100
1000
5100
1000
6199
198除1外,所有葫蘆的入度均為1
7200
231所有從1到n的路徑經過的葫蘆數相等
8200
2000
9200
2000
10200
2000
對於所有資料,小澳爬過每條藤消耗的能量不會超過10^3,且一定存在一條從1到n的路徑。
—————————————————分割線———————————————
分析:【algorithm1】 第乙個測試點只有一條邊,輸出 w/2 就可以啦。 可以通過第 1 個測試點。
【algorithm2】 注意到「除 1 外,所有葫蘆的入度均為 1」,也就是說,從 1 到 n 的路徑只有 一條,輸出這一條路徑的長度與這條路徑上的點數的比值就可以了。 可以通過第 1、2、6 個測試點。
【algorithm3】 對於這樣一類特殊資料,「所有從 1 到 n 的路徑經過的葫蘆數相等」,也就 是說 1~n 的最短路就是最優路徑,最短路的長度與路徑上的點數的比值就是答 案。 可以通過第 1、2、3、6、7 個測試點。
【algorithm4】 另建乙個起點 0,連線一條 0 到 1 長度為 0 的邊,就此將問題轉化為長度和 邊數最小比值。這個問題的求解需要分數規劃。 假設答案為 ans,對於任意一條由 k 條邊組成的路徑,有: ( w1 + w2 + w3 + …+wk ) / k >= ans ;
轉化一下: ( w1 + w2 + w3 + … + wk ) >= ans * k ; 即 ( w1 - ans ) + ( w2 - ans ) + ( w3 - ans ) + … + ( wk - ans ) >= 0 。 於是就得到了這樣乙個演算法: 二分答案 x,每次將每一條邊的權值減去 x 求最短路,判斷 1~n 的最短路是 否大於 0:若大於 0,則說明答案 ans>x;否則說明 ans
1 #include "calabashcstdio
"2 #include "
iostream
"3 #include "
vector
"4 #include "
queue
"5 #include "
cstring"6
7using
namespace
std ;
8struct edge ;//
org原始的邊權
9const
int maxn = 10010;10
const
double inf =1e20 ;
11const
double eps = 1e-4 ;//
誤差範圍
1213 edge e[ maxn << 2
] ;14
double
dis[ maxn ] ;
15bool
vis[ maxn ] ;
16int
head[ maxn ] ;
1718
intcnt , n , m ;
1920 queueq;
2122
intinput ( )
25while ( ch >='
0' && ch <='
9' )
26return x *f ;27}
2829
void add_edge ( const
int x , const
int y , const
double
val )
3536
bool spfa ( const
double x ) 55}
56} 57}
5859
return dis[ n ] < -eps ;60}
6162
intmain ( )
68 add_edge ( 0 , 1 , 0 ) ;//
加入0虛擬節點
69double l = 0 , r =1e3 ;
70while ( r - l >= eps )
75 printf ( "
%.3lf
", l ) ;
76return0;
77 }
noip_rp++;
2016-10-08 21:20:05
(完)
YCH的模擬賽 T3
暴搜或者字典樹,但是因為輸出所有的方案而不是方案數,不管什麼做法都逃不過輸出,所以都差不多 sol1 記憶化搜尋 當列舉方案時,f i 表示已經把字串的前i個字母都拼好的情況下有多少方案 考慮從第i 1個字元開始到j是乙個給定的單詞 如果有這樣的j的話就可以轉移 然後開乙個vector把每乙個狀態下...
20180711模擬賽T3 聚變
檔名 fusion 題目型別 傳統題 時間限制 3秒 記憶體限制 256mb 編譯優化 無 知名科學家小a在2118年在計算機上實現了模擬聚變的過程。我們將她研究的過程簡化。核子共有26種,可以用a到z共26個字母表示。核子聚變的過程可以用乙個字串描述。按照順序從左到右的順序,假如有兩個相同核子相鄰...
11 5NOIP模擬賽解題報告
預計得分 100 40 30 170 實際得分 100 100 50 250 辣雞資料毀我青春 t1一眼不會做感覺要涼 t2好像一波折半搜尋就做完了 t3好像是神仙題不會做。打完t1暴力後去淦t2,結果最後在排序的時候把greater 寫成了greater 不過感謝辣雞資料放我一條活路。手玩了一下t...