NOIP歡樂模擬賽 T3 解題報告

2022-06-02 16:15:12 字數 3666 閱讀 7349

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 "

cstdio

"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 }

calabash

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...