第六届团队程序设计天梯赛 全题目解析讲解
B站已經(jīng)錄好視頻合集:--------------------傳送門---------------------
題目是2021年4月天梯賽決賽原題:
| L1-1 | 人與神 |
| L1-2 | 兩小時(shí)學(xué)完C語(yǔ)言 |
| L1-3 | 強(qiáng)迫癥 |
| L1-4 | 降價(jià)提醒機(jī)器人 |
| L1-5 | 大笨鐘的心情 |
| L1-6 | 吉老師的回歸 |
| L1-7 | 天梯賽的善良 |
| L1-8 | 乘法口訣數(shù)列 |
| L2-1 | 包裝機(jī) |
| L2-2 | 病毒溯源 |
| L2-3 | 清點(diǎn)代碼庫(kù) |
| L2-4 | 哲哲打游戲 |
| L3-1 | 森森旅游 |
| L3-2 | 還原文件 |
| L3-3 | 可憐的簡(jiǎn)單題 |
AC代碼:
L1-1 人與神
跨界大神 L. Peter Deutsch 有一句名言:“To iterate is human, to recurse divine.”(迭代的是人,遞歸的是神)。本題就請(qǐng)你直接在屏幕上輸出這句話。
輸入格式:
本題沒有輸入。
輸出格式:
在一行中輸出 To iterate is human, to recurse divine.。
輸入樣例:
無(wú)
輸出樣例:
To iterate is human, to recurse divine.
L1-2 兩小時(shí)學(xué)完C語(yǔ)言
知乎上有個(gè)寶寶問(wèn):“兩個(gè)小時(shí)內(nèi)如何學(xué)完 C 語(yǔ)言?”當(dāng)然,問(wèn)的是“學(xué)完”并不是“學(xué)會(huì)”。
假設(shè)一本 C 語(yǔ)言教科書有 N 個(gè)字,這個(gè)寶寶每分鐘能看 K 個(gè)字,看了 M 分鐘。還剩多少字沒有看?
輸入格式:
輸入在一行中給出 3 個(gè)正整數(shù),分別是 N(不超過(guò) 400 000),教科書的總字?jǐn)?shù);K(不超過(guò) 3 000),是寶寶每分鐘能看的字?jǐn)?shù);M(不超過(guò) 120),是寶寶看書的分鐘數(shù)。
題目保證寶寶看完的字?jǐn)?shù)不超過(guò) N。
輸出格式:
在一行中輸出寶寶還沒有看的字?jǐn)?shù)。
輸入樣例:
100000 1000 72
輸出樣例:
28000
L1-3 強(qiáng)迫癥
小強(qiáng)在統(tǒng)計(jì)一個(gè)小區(qū)里居民的出生年月,但是發(fā)現(xiàn)大家填寫的生日格式不統(tǒng)一,例如有的人寫 199808,有的人只寫 9808。有強(qiáng)迫癥的小強(qiáng)請(qǐng)你寫個(gè)程序,把所有人的出生年月都整理成 年年年年-月月 格式。對(duì)于那些只寫了年份后兩位的信息,我們默認(rèn)小于 22 都是 20 開頭的,其他都是 19 開頭的。
輸入格式:
輸入在一行中給出一個(gè)出生年月,為一個(gè) 6 位或者 4 位數(shù),題目保證是 1000 年 1 月到 2021 年 12 月之間的合法年月。
輸出格式:
在一行中按標(biāo)準(zhǔn)格式 年年年年-月月 將輸入的信息整理輸出。
輸入樣例 1:
9808
輸出樣例 1:
1998-08
輸入樣例 2:
0510
輸出樣例 2:
2005-10
輸入樣例 3:
196711
輸出樣例 3:
1967-11
L1-4 降價(jià)提醒機(jī)器人
小 T 想買一個(gè)玩具很久了,但價(jià)格有些高,他打算等便宜些再買。但天天盯著購(gòu)物網(wǎng)站很麻煩,請(qǐng)你幫小 T 寫一個(gè)降價(jià)提醒機(jī)器人,當(dāng)玩具的當(dāng)前價(jià)格比他設(shè)定的價(jià)格便宜時(shí)發(fā)出提醒。
輸入格式:
輸入第一行是兩個(gè)正整數(shù) N 和 M (1≤N≤100,0≤M≤1000),表示有 N 條價(jià)格記錄,小 T 設(shè)置的價(jià)格為 M。
接下來(lái) N 行,每行有一個(gè)實(shí)數(shù) Pi?(?1000.0<Pi?<1000.0),表示一條價(jià)格記錄。
輸出格式:
對(duì)每一條比設(shè)定價(jià)格 M 便宜的價(jià)格記錄 P,在一行中輸出 On Sale! P,其中 P 輸出到小數(shù)點(diǎn)后 1 位。
輸入樣例:
4 99
98.0
97.0
100.2
98.9
輸出樣例:
On Sale! 98.0
On Sale! 97.0
On Sale! 98.9
L1-5 大笨鐘的心情
有網(wǎng)友問(wèn):未來(lái)還會(huì)有更多大笨鐘題嗎?笨鐘回復(fù)說(shuō):看心情……
本題就請(qǐng)你替大笨鐘寫一個(gè)程序,根據(jù)心情自動(dòng)輸出回答。
輸入格式:
輸入在一行中給出 24 個(gè) [0, 100] 區(qū)間內(nèi)的整數(shù),依次代表大笨鐘在一天 24 小時(shí)中,每個(gè)小時(shí)的心情指數(shù)。
隨后若干行,每行給出一個(gè) [0, 23] 之間的整數(shù),代表網(wǎng)友詢問(wèn)笨鐘這個(gè)問(wèn)題的時(shí)間點(diǎn)。當(dāng)出現(xiàn)非法的時(shí)間點(diǎn)時(shí),表示輸入結(jié)束,這個(gè)非法輸入不要處理。題目保證至少有 1 次詢問(wèn)。
輸出格式:
對(duì)每一次提問(wèn),如果當(dāng)時(shí)笨鐘的心情指數(shù)大于 50,就在一行中輸出 心情指數(shù) Yes,否則輸出 心情指數(shù) No。
輸入樣例:
80 75 60 50 20 20 20 20 55 62 66 51 42 33 47 58 67 52 41 20 35 49 50 63
17
7
3
15
-1
輸出樣例:
52 Yes
20 No
50 No
58 Yes
L1-6 吉老師的回歸
曾經(jīng)在天梯賽大殺四方的吉老師決定回歸天梯賽賽場(chǎng)啦!
為了簡(jiǎn)化題目,我們不妨假設(shè)天梯賽的每道題目可以用一個(gè)不超過(guò) 500 的、只包括可打印符號(hào)的字符串描述出來(lái),如:Problem A: Print “Hello world!”。
眾所周知,吉老師的競(jìng)賽水平非常高超,你可以認(rèn)為他每道題目都會(huì)做(事實(shí)上也是……)。因此,吉老師會(huì)按照順序看題并做題。但吉老師水平太高了,所以簽到題他就懶得做了(浪費(fèi)時(shí)間),具體來(lái)說(shuō),假如題目的字符串里有 qiandao 或者 easy(區(qū)分大小寫)的話,吉老師看完題目就會(huì)跳過(guò)這道題目不做。
現(xiàn)在給定這次天梯賽總共有幾道題目以及吉老師已經(jīng)做完了幾道題目,請(qǐng)你告訴大家吉老師現(xiàn)在正在做哪個(gè)題,或者吉老師已經(jīng)把所有他打算做的題目做完了。
提醒:天梯賽有分?jǐn)?shù)升級(jí)的規(guī)則,如果不做簽到題可能導(dǎo)致團(tuán)隊(duì)總分不足以升級(jí),一般的選手請(qǐng)千萬(wàn)不要學(xué)習(xí)吉老師的酷炫行為!
輸入格式:
輸入第一行是兩個(gè)正整數(shù) N,M (1≤M≤N≤30),表示本次天梯賽有 N 道題目,吉老師現(xiàn)在做完了 M 道。
接下來(lái) N 行,每行是一個(gè)符合題目描述的字符串,表示天梯賽的題目?jī)?nèi)容。吉老師會(huì)按照給出的順序看題——第一行就是吉老師看的第一道題,第二行就是第二道,以此類推。
輸出格式:
在一行中輸出吉老師當(dāng)前正在做的題目對(duì)應(yīng)的題面(即做完了 M 道題目后,吉老師正在做哪個(gè)題)。如果吉老師已經(jīng)把所有他打算做的題目做完了,輸出一行 Wo AK le。
輸入樣例 1:
5 1
L1-1 is a qiandao problem.
L1-2 is so…easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so easy.
輸出樣例 1:
L1-4 is qianDao.
輸入樣例 2:
5 4
L1-1 is a-qiandao problem.
L1-2 is so easy.
L1-3 is Easy.
L1-4 is qianDao.
Wow, such L1-5, so!!easy.
輸出樣例 2:
Wo AK le
L1-7 天梯賽的善良
天梯賽是個(gè)善良的比賽。善良的命題組希望將題目難度控制在一個(gè)范圍內(nèi),使得每個(gè)參賽的學(xué)生都有能做出來(lái)的題目,并且最厲害的學(xué)生也要非常努力才有可能得到高分。
于是命題組首先將編程能力劃分成了 10^6個(gè)等級(jí)(太瘋狂了,這是假的),然后調(diào)查了每個(gè)參賽學(xué)生的編程能力。現(xiàn)在請(qǐng)你寫個(gè)程序找出所有參賽學(xué)生的最小和最大能力值,給命題組作為出題的參考。
輸入格式:
輸入在第一行中給出一個(gè)正整數(shù) N(≤2×10^4 ),即參賽學(xué)生的總數(shù)。隨后一行給出 N 個(gè)不超過(guò) 10^6的正整數(shù),是參賽學(xué)生的能力值。
輸出格式:
第一行輸出所有參賽學(xué)生的最小能力值,以及具有這個(gè)能力值的學(xué)生人數(shù)。第二行輸出所有參賽學(xué)生的最大能力值,以及具有這個(gè)能力值的學(xué)生人數(shù)。同行數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。
輸入樣例:
10
86 75 233 888 666 75 886 888 75 666
輸出樣例:
75 3
888 2
L1-8 乘法口訣數(shù)列
本題要求你從任意給定的兩個(gè) 1 位數(shù)字 a1?和a2開始,用乘法口訣生成一個(gè)數(shù)列 {an?},規(guī)則為從a1?開始順次進(jìn)行,每次將當(dāng)前數(shù)字與后面一個(gè)數(shù)字相乘,將結(jié)果貼在數(shù)列末尾。如果結(jié)果不是 1 位數(shù),則其每一位都應(yīng)成為數(shù)列的一項(xiàng)。
輸入格式:
輸入在一行中給出 3 個(gè)整數(shù),依次為 a1?、a2?和n,滿足 0≤a1?,a2?≤9,0<n≤10^3。
輸出格式:
在一行中輸出數(shù)列的前 n 項(xiàng)。數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。
輸入樣例:
2 3 10
輸出樣例:
2 3 6 1 8 6 8 4 8 4
樣例解釋:
數(shù)列前 2 項(xiàng)為 2 和 3。從 2 開始,因?yàn)?2×3=6,所以第 3 項(xiàng)是 6。因?yàn)?3×6=18,所以第 4、5 項(xiàng)分別是 1、8。依次類推…… 最后因?yàn)榈?6 項(xiàng)有 6×8=48,對(duì)應(yīng)第 10、11 項(xiàng)應(yīng)該是 4、8。而因?yàn)橹灰筝敵銮?10 項(xiàng),所以在輸出 4 后結(jié)束。
L2-1 包裝機(jī)
一種自動(dòng)包裝機(jī)的結(jié)構(gòu)如圖 1 所示。首先機(jī)器中有 N 條軌道,放置了一些物品。軌道下面有一個(gè)筐。當(dāng)某條軌道的按鈕被按下時(shí),活塞向左推動(dòng),將軌道盡頭的一件物品推落筐中。當(dāng) 0 號(hào)按鈕被按下時(shí),機(jī)械手將抓取筐頂部的一件物品,放到流水線上。圖 2 顯示了順序按下按鈕 3、2、3、0、1、2、0 后包裝機(jī)的狀態(tài)。
圖1 自動(dòng)包裝機(jī)的結(jié)構(gòu)
圖 2 順序按下按鈕 3、2、3、0、1、2、0 后包裝機(jī)的狀態(tài)
一種特殊情況是,因?yàn)榭鸬娜萘渴怯邢薜?#xff0c;當(dāng)筐已經(jīng)滿了,但仍然有某條軌道的按鈕被按下時(shí),系統(tǒng)應(yīng)強(qiáng)制啟動(dòng) 0 號(hào)鍵,先從筐里抓出一件物品,再將對(duì)應(yīng)軌道的物品推落。此外,如果軌道已經(jīng)空了,再按對(duì)應(yīng)的按鈕不會(huì)發(fā)生任何事;同樣的,如果筐是空的,按 0 號(hào)按鈕也不會(huì)發(fā)生任何事。
現(xiàn)給定一系列按鈕操作,請(qǐng)你依次列出流水線上的物品。
輸入格式:
輸入第一行給出 3 個(gè)正整數(shù) N(≤100)、M(≤1000)和 Smax(≤100),分別為軌道的條數(shù)(于是軌道從 1 到 N 編號(hào))、每條軌道初始放置的物品數(shù)量、以及筐的最大容量。隨后 N 行,每行給出 M 個(gè)英文大寫字母,表示每條軌道的初始物品擺放。
最后一行給出一系列數(shù)字,順序?qū)?yīng)被按下的按鈕編號(hào),直到 ?1 標(biāo)志輸入結(jié)束,這個(gè)數(shù)字不要處理。數(shù)字間以空格分隔。題目保證至少會(huì)取出一件物品放在流水線上。
輸出格式:
在一行中順序輸出流水線上的物品,不得有任何空格。
輸入樣例:
3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1
輸出樣例:
MATA
L2-2 病毒溯源
病毒容易發(fā)生變異。某種病毒可以通過(guò)突變產(chǎn)生若干變異的毒株,而這些變異的病毒又可能被誘發(fā)突變產(chǎn)生第二代變異,如此繼續(xù)不斷變化。
現(xiàn)給定一些病毒之間的變異關(guān)系,要求你找出其中最長(zhǎng)的一條變異鏈。
在此假設(shè)給出的變異都是由突變引起的,不考慮復(fù)雜的基因重組變異問(wèn)題 —— 即每一種病毒都是由唯一的一種病毒突變而來(lái),并且不存在循環(huán)變異的情況。
輸入格式:
輸入在第一行中給出一個(gè)正整數(shù) N(≤10^4 ),即病毒種類的總數(shù)。于是我們將所有病毒從 0 到 N?1 進(jìn)行編號(hào)。
隨后 N 行,每行按以下格式描述一種病毒的變異情況:
k 變異株1 …… 變異株k
其中 k 是該病毒產(chǎn)生的變異毒株的種類數(shù),后面跟著每種變異株的編號(hào)。第 i 行對(duì)應(yīng)編號(hào)為 i 的病毒(0≤i<N)。題目保證病毒源頭有且僅有一個(gè)。
輸出格式:
首先輸出從源頭開始最長(zhǎng)變異鏈的長(zhǎng)度。
在第二行中輸出從源頭開始最長(zhǎng)的一條變異鏈,編號(hào)間以 1 個(gè)空格分隔,行首尾不得有多余空格。如果最長(zhǎng)鏈不唯一,則輸出最小序列。
注:我們稱序列 {a1 ,?,an } 比序列 { b1 ,?,bn} “小”,如果存在 1≤k≤n 滿足 ai=bi對(duì)所有 i<k 成立,且 ak<bk。
輸入樣例:
10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1
輸出樣例:
4
0 4 9 1
L2-3 清點(diǎn)代碼庫(kù)
上圖轉(zhuǎn)自新浪微博:“阿里代碼庫(kù)有幾億行代碼,但其中有很多功能重復(fù)的代碼,比如單單快排就被重寫了幾百遍。請(qǐng)?jiān)O(shè)計(jì)一個(gè)程序,能夠?qū)⒋a庫(kù)中所有功能重復(fù)的代碼找出。各位大佬有啥想法,我當(dāng)時(shí)就懵了,然后就掛了。。?!?/p>
這里我們把問(wèn)題簡(jiǎn)化一下:首先假設(shè)兩個(gè)功能模塊如果接受同樣的輸入,總是給出同樣的輸出,則它們就是功能重復(fù)的;其次我們把每個(gè)模塊的輸出都簡(jiǎn)化為一個(gè)整數(shù)(在 int 范圍內(nèi))。于是我們可以設(shè)計(jì)一系列輸入,檢查所有功能模塊的對(duì)應(yīng)輸出,從而查出功能重復(fù)的代碼。你的任務(wù)就是設(shè)計(jì)并實(shí)現(xiàn)這個(gè)簡(jiǎn)化問(wèn)題的解決方案。
輸入格式:
輸入在第一行中給出 2 個(gè)正整數(shù),依次為 N(≤10^4)和 M(≤10^2),對(duì)應(yīng)功能模塊的個(gè)數(shù)和系列測(cè)試輸入的個(gè)數(shù)。
隨后 N 行,每行給出一個(gè)功能模塊的 M 個(gè)對(duì)應(yīng)輸出,數(shù)字間以空格分隔。
輸出格式:
首先在第一行輸出不同功能的個(gè)數(shù) K。隨后 K 行,每行給出具有這個(gè)功能的模塊的個(gè)數(shù),以及這個(gè)功能的對(duì)應(yīng)輸出。數(shù)字間以 1 個(gè)空格分隔,行首尾不得有多余空格。輸出首先按模塊個(gè)數(shù)非遞增順序,如果有并列,則按輸出序列的遞增序給出。
注:所謂數(shù)列 { A1 , …, AM } 比 { B1 , …, BM} 大,是指存在 1≤i<M,使得 A1=B1 ,…,Ai=Bi成立,且 Ai+1>Bi+1。
輸入樣例:
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
輸出樣例:
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35
L2-4 哲哲打游戲
哲哲是一位硬核游戲玩家。最近一款名叫《達(dá)諾達(dá)諾》的新游戲剛剛上市,哲哲自然要快速攻略游戲,守護(hù)硬核游戲玩家的一切!
為簡(jiǎn)化模型,我們不妨假設(shè)游戲有 N 個(gè)劇情點(diǎn),通過(guò)游戲里不同的操作或選擇可以從某個(gè)劇情點(diǎn)去往另外一個(gè)劇情點(diǎn)。此外,游戲還設(shè)置了一些存檔,在某個(gè)劇情點(diǎn)可以將玩家的游戲進(jìn)度保存在一個(gè)檔位上,讀取存檔后可以回到劇情點(diǎn),重新進(jìn)行操作或者選擇,到達(dá)不同的劇情點(diǎn)。
為了追蹤硬核游戲玩家哲哲的攻略進(jìn)度,你打算寫一個(gè)程序來(lái)完成這個(gè)工作。假設(shè)你已經(jīng)知道了游戲的全部劇情點(diǎn)和流程,以及哲哲的游戲操作,請(qǐng)你輸出哲哲的游戲進(jìn)度。
輸入格式:
輸入第一行是兩個(gè)正整數(shù) N 和 M (1≤N,M≤10^5),表示總共有 N 個(gè)劇情點(diǎn),哲哲有 M 個(gè)游戲操作。
接下來(lái)的 N 行,每行對(duì)應(yīng)一個(gè)劇情點(diǎn)的發(fā)展設(shè)定。第 i 行的第一個(gè)數(shù)字是 Ki?,表示劇情點(diǎn) i 通過(guò)一些操作或選擇能去往下面 Ki?個(gè)劇情點(diǎn);接下來(lái)有 Ki?個(gè)數(shù)字,第 k 個(gè)數(shù)字表示做第 k 個(gè)操作或選擇可以去往的劇情點(diǎn)編號(hào)。
最后有 M 行,每行第一個(gè)數(shù)字是 0、1 或 2,分別表示:
0 表示哲哲做出了某個(gè)操作或選擇,后面緊接著一個(gè)數(shù)字 j,表示哲哲在當(dāng)前劇情點(diǎn)做出了第 j 個(gè)選擇。我們保證哲哲的選擇永遠(yuǎn)是合法的。
1 表示哲哲進(jìn)行了一次存檔,后面緊接著是一個(gè)數(shù)字 j,表示存檔放在了第 j 個(gè)檔位上。
2 表示哲哲進(jìn)行了一次讀取存檔的操作,后面緊接著是一個(gè)數(shù)字 j,表示讀取了放在第 j 個(gè)位置的存檔。
約定:所有操作或選擇以及劇情點(diǎn)編號(hào)都從 1 號(hào)開始。存檔的檔位不超過(guò) 100 個(gè),編號(hào)也從 1 開始。游戲默認(rèn)從 1 號(hào)劇情點(diǎn)開始??偟倪x項(xiàng)數(shù)(即 ∑Ki?)不超過(guò) 10^6。
輸出格式:
對(duì)于每個(gè) 1(即存檔)操作,在一行中輸出存檔的劇情點(diǎn)編號(hào)。
最后一行輸出哲哲最后到達(dá)的劇情點(diǎn)編號(hào)。
輸入樣例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
輸出樣例:
1
3
9
10
樣例解釋:
簡(jiǎn)單給出樣例中經(jīng)過(guò)的劇情點(diǎn)順序:
1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。
檔位 1 開始存的是 1 號(hào)劇情點(diǎn);檔位 2 存的是 3 號(hào)劇情點(diǎn);檔位 1 后來(lái)又存了 9 號(hào)劇情點(diǎn)。
// s[i][j] = k 表示在 劇情點(diǎn)i的第j個(gè)選擇是通向劇情k的 // vector <int> s[100000 + 10]; #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; int n, m, now = 1; int rec[110]; vector <int> vec[Maxn]; int main() {scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++) {int k;scanf("%d", &k);for(int j = 1; j <= k; j++) {int v;scanf("%d", &v);vec[i].push_back(v); // vec[1][0] = 2, vec[1][1] = 3 ...}}for(int i = 1; i <= m; i++) {int a, b;scanf("%d%d", &a, &b);if(a == 0) {// now 現(xiàn)在的劇情點(diǎn) // vec[now][b - 1] 將要到達(dá)的劇情點(diǎn)now = vec[now][b - 1]; }else if(a == 1) {printf("%d\n", now);rec[b] = now;}else if(a == 2) {now = rec[b];}}printf("%d", now);return 0; }L3-1 森森旅游
好久沒出去旅游啦!森森決定去 Z 省旅游一下。
Z 省有 n 座城市(從 1 到 n 編號(hào))以及 m 條連接兩座城市的有向旅行線路(例如自駕、長(zhǎng)途汽車、火車、飛機(jī)、輪船等),每次經(jīng)過(guò)一條旅行線路時(shí)都需要支付該線路的費(fèi)用(但這個(gè)收費(fèi)標(biāo)準(zhǔn)可能不止一種,例如車票跟機(jī)票一般不是一個(gè)價(jià)格)。
Z 省為了鼓勵(lì)大家在省內(nèi)多逛逛,推出了旅游金計(jì)劃:在 i 號(hào)城市可以用 1 元現(xiàn)金兌換 ai?元旅游金(只要現(xiàn)金足夠,可以無(wú)限次兌換)。城市間的交通即可以使用現(xiàn)金支付路費(fèi),也可以用旅游金支付。具體來(lái)說(shuō),當(dāng)通過(guò)第 j 條旅行線路時(shí),可以用 cj元現(xiàn)金或 dj元旅游金支付路費(fèi)。注意: 每次只能選擇一種支付方式,不可同時(shí)使用現(xiàn)金和旅游金混合支付。但對(duì)于不同的線路,旅客可以自由選擇不同的支付方式。
森森決定從 1 號(hào)城市出發(fā),到 n 號(hào)城市去。他打算在出發(fā)前準(zhǔn)備一些現(xiàn)金,并在途中的某個(gè)城市將剩余現(xiàn)金 全部 換成旅游金后繼續(xù)旅游,直到到達(dá) n 號(hào)城市為止。當(dāng)然,他也可以選擇在 1 號(hào)城市就兌換旅游金,或全部使用現(xiàn)金完成旅程。
Z 省政府會(huì)根據(jù)每個(gè)城市參與活動(dòng)的情況調(diào)整匯率(即調(diào)整在某個(gè)城市 1 元現(xiàn)金能換多少旅游金)?,F(xiàn)在你需要幫助森森計(jì)算一下,在每次調(diào)整之后最少需要攜帶多少現(xiàn)金才能完成他的旅程。
輸入格式:
輸入在第一行給出三個(gè)整數(shù) n,m 與 q(1≤n≤10^5, 1≤m≤2×10 ^5,1≤q≤10 ^5),依次表示城市的數(shù)量、旅行線路的數(shù)量以及匯率調(diào)整的次數(shù)。
接下來(lái) m 行,每行給出四個(gè)整數(shù) u,v,c 與 d(1≤u,v≤n,1≤c,d≤10^9),表示一條從 u 號(hào)城市通向 v 號(hào)城市的有向旅行線路。每次通過(guò)該線路需要支付 c 元現(xiàn)金或 d 元旅游金。數(shù)字間以空格分隔。輸入保證從 1 號(hào)城市出發(fā),一定可以通過(guò)若干條線路到達(dá) n 號(hào)城市,但兩城市間的旅行線路可能不止一條,對(duì)應(yīng)不同的收費(fèi)標(biāo)準(zhǔn);也允許在城市內(nèi)部游玩(即 u 和 v 相同)。
接下來(lái)的一行輸入 n 個(gè)整數(shù) a1,a2,?,an(1≤ai≤10^9),其中 ai表示一開始在 i 號(hào)城市能用 1 元現(xiàn)金兌換ai個(gè)旅游金。數(shù)字間以空格分隔。
接下來(lái) q 行描述匯率的調(diào)整。第 i 行輸入兩個(gè)整數(shù) xi與ai′(1≤xi≤n,1≤ai′≤10^9),表示第 i 次匯率調(diào)整后,xi號(hào)城市能用 1 元現(xiàn)金兌換 ai′?個(gè)旅游金,而其它城市旅游金匯率不變。請(qǐng)注意:每次匯率調(diào)整都是在上一次匯率調(diào)整的基礎(chǔ)上進(jìn)行的。
輸出格式:
對(duì)每一次匯率調(diào)整,在對(duì)應(yīng)的一行中輸出調(diào)整后森森至少需要準(zhǔn)備多少現(xiàn)金,才能按他的計(jì)劃從 1 號(hào)城市旅行到 n 號(hào)城市。
再次提醒:如果森森決定在途中的某個(gè)城市兌換旅游金,那么他必須將剩余現(xiàn)金全部、一次性兌換,剩下的旅途將完全使用旅游金支付。
輸入樣例:
6 11 3
1 2 3 5
1 3 8 4
2 4 4 6
3 1 8 6
1 3 10 8
2 3 2 8
3 4 5 3
3 5 10 7
3 3 2 3
4 6 10 12
5 6 10 6
3 4 5 2 5 100
1 2
2 1
1 17
輸出樣例:
8
8
1
樣例解釋:
對(duì)于第一次匯率調(diào)整,森森可以沿著 1→2→4→6 的線路旅行,并在 2 號(hào)城市兌換旅游金;
對(duì)于第二次匯率調(diào)整,森森可以沿著 1→2→3→4→6 的線路旅行,并在 3 號(hào)城市兌換旅游金;
對(duì)于第三次匯率調(diào)整,森森可以沿著 1→3→5→6 的線路旅行,并在 1 號(hào)城市兌換旅游金。
// 迪杰斯特拉算法: 求一個(gè)點(diǎn)到其他所有點(diǎn)的距離(n^2)(優(yōu)先隊(duì)列優(yōu)化,n*logn) // 本題題意要的解法: 至少要求出點(diǎn)1到其他所有點(diǎn)的距離(n*logn)。 // 再求出每個(gè)點(diǎn)到點(diǎn)n的距離..(建立反向邊, 改成了求點(diǎn)n到其他點(diǎn)的距離) // 對(duì)于每個(gè)點(diǎn)ui就都能求出:到 點(diǎn)ui時(shí)的花費(fèi)現(xiàn)金數(shù)量qi, 點(diǎn)ui到點(diǎn)n花費(fèi)的旅游金數(shù)量pi ,至少要帶qi+[pi/ai] ([]表示向上取整) // 鄰接表建邊、迪杰斯特拉算法、會(huì)使用優(yōu)先隊(duì)列、pair類型的使用 // 高等數(shù)據(jù)結(jié)構(gòu):線段樹 (修改操作是logn(單點(diǎn)修改,不是區(qū)間修改),查詢操作也是logn,單獨(dú)查詢最小值的話是1) // 查詢的復(fù)雜度就降低成了 q*logn// 題目整體復(fù)雜度 max(n * logn, q * logn), n和q是等階的 #include <bits/stdc++.h> using namespace std; const int Maxn = 100000 + 10; const int Maxm = 200000 + 20; int n, m, t; long long tree[Maxn << 2]; // 記錄到達(dá)每個(gè)點(diǎn)的花費(fèi),同時(shí)也能記錄一段區(qū)間的最小花費(fèi) int a[Maxn]; int ecnt, head[Maxn]; int cecnt, chead[Maxn]; long long dis[Maxn], cdis[Maxn]; // dis[i]表示點(diǎn)1到點(diǎn)i的距離 cdisn[i] 表示點(diǎn)n到點(diǎn)i的距離(反向邊) bool vis[Maxn]; //表示點(diǎn)i是否作為最短路點(diǎn)進(jìn)行了對(duì)其他點(diǎn)最短路的更新 typedef pair<long long, int> pii; priority_queue <pii, vector<pii>, greater<pii> > q; // 聲明好了一個(gè)按最小值排序的小頂堆(也就是優(yōu)先隊(duì)列) struct list {int to, nxt, w; }e[Maxm], ce[Maxm]; void add_edge(int u, int v, int w) {e[++ecnt].to = v;e[ecnt].w = w;e[ecnt].nxt = head[u];head[u] = ecnt; } void add_cedge(int u, int v, int w) {ce[++cecnt].to = v;ce[cecnt].w = w;ce[cecnt].nxt = chead[u];chead[u] = cecnt; } void build_tree(int cur, int l, int r) {if(l == r) {if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;build_tree(cur << 1, l, mid);build_tree(cur << 1 | 1, mid + 1, r);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }void modify(int cur, int l, int r, int tar, int val) {if(l == r) {a[l] = val;if(dis[l] == 1e18 || cdis[l] == 1e18) tree[cur] = 2e18;else tree[cur] = dis[l] + (cdis[l] / a[l] + (cdis[l] % a[l] != 0)); return;}int mid = l + r >> 1;if(tar <= mid) modify(cur << 1, l, mid, tar, val);else modify(cur << 1 | 1, mid + 1, r, tar, val);tree[cur] = min(tree[cur << 1], tree[cur << 1 | 1]); }int main() {scanf("%d%d%d", &n, &m, &t);for(int i = 1; i <= m; i++) {int u, v, w1, w2;scanf("%d%d%d%d", &u, &v, &w1, &w2);add_edge(u, v, w1);add_cedge(v, u, w2);}for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = 1; i <= n; i++) dis[i] = cdis[i] = 1e18;dis[1] = 0;q.push(make_pair(dis[1], 1));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = head[x]; i; i = e[i].nxt)if(dis[x] + e[i].w < dis[e[i].to]) {dis[e[i].to] = dis[x] + e[i].w;q.push(make_pair(dis[e[i].to], e[i].to));}} for(int i = 1; i <= n; i++) vis[i] = false;cdis[n] = 0;q.push(make_pair(dis[n], n));while(!q.empty()) {int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = true;for(int i = chead[x]; i; i = ce[i].nxt)if(cdis[x] + ce[i].w < cdis[ce[i].to]) {cdis[ce[i].to] = cdis[x] + ce[i].w;q.push(make_pair(cdis[ce[i].to], ce[i].to));}} // for(int i = 1; i <= n; i++) printf("點(diǎn)1到達(dá)點(diǎn)%d的距離是:%lld,點(diǎn)%d到達(dá)點(diǎn)n的距離是:%lld\n", i, dis[i], i, cdis[i]);build_tree(1, 1, n);for(int i = 1; i <= t; i++) {int x, a_;scanf("%d%d", &x, &a_);modify(1, 1, n, x, a_);printf("%lld\n", tree[1]);}return 0; }L3-2 還原文件
一份重要文件被撕成兩半,其中一半還被送進(jìn)了碎紙機(jī)。我們將碎紙機(jī)里找到的紙條進(jìn)行編號(hào),如圖 1 所示。然后根據(jù)斷口的折線形狀跟沒有切碎的半張紙進(jìn)行匹配,最后還原成圖 2 的樣子。要求你輸出還原后紙條的正確拼接順序。
圖1 紙條編號(hào)
圖2 還原結(jié)果
輸入格式:
輸入首先在第一行中給出一個(gè)正整數(shù) N(1<N≤10^5),為沒有切碎的半張紙上斷口折線角點(diǎn)的個(gè)數(shù);隨后一行給出從左到右 N 個(gè)折線角點(diǎn)的高度值(均為不超過(guò) 100 的非負(fù)整數(shù))。
隨后一行給出一個(gè)正整數(shù) M(≤100),為碎紙機(jī)里的紙條數(shù)量。接下去有 M 行,其中第 i 行給出編號(hào)為 i(1≤i≤M)的紙條的斷口信息,格式為:K h[1] h[2] … h[K]其中 K 是斷口折線角點(diǎn)的個(gè)數(shù)(不超過(guò) 10^4+1),后面是從左到右 K 個(gè)折線角點(diǎn)的高度值。為簡(jiǎn)單起見,這個(gè)“高度”跟沒有切碎的半張紙上斷口折線角點(diǎn)的高度是一致的。
輸出格式:
在一行中輸出還原后紙條的正確拼接順序。紙條編號(hào)間以一個(gè)空格分隔,行首尾不得有多余空格。
題目數(shù)據(jù)保證存在唯一解。
輸入樣例:
17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68
輸出樣例:
3 6 1 5 2 4
L3-3 可憐的簡(jiǎn)單題
九條可憐去年出了一道題,導(dǎo)致一眾參賽高手慘遭團(tuán)滅。今年她出了一道簡(jiǎn)單題 —— 打算按照如下的方式生成一個(gè)隨機(jī)的整數(shù)數(shù)列 A:
1.最開始,數(shù)列 A 為空。
2.可憐會(huì)從區(qū)間 [1,n] 中等概率隨機(jī)一個(gè)整數(shù) i 加入到數(shù)列 A 中。
3.如果不存在一個(gè)大于 1 的正整數(shù) w,滿足 A 中所有元素都是 w 的倍數(shù),數(shù)組 A 將會(huì)作為隨機(jī)生成的結(jié)果返回。否則,可憐將會(huì)返回第二步,繼續(xù)增加 A 的長(zhǎng)度。
現(xiàn)在,可憐告訴了你數(shù)列 n 的值,她希望你計(jì)算返回的數(shù)列 A 的期望長(zhǎng)度。
輸入格式:
輸入一行兩個(gè)整數(shù) n,p (1≤n≤10^11,n<p≤10 ^12 ),p 是一個(gè)質(zhì)數(shù)。
輸出格式:
在一行中輸出一個(gè)整數(shù),表示答案對(duì) p 取模的值。具體來(lái)說(shuō),假設(shè)答案的最簡(jiǎn)分?jǐn)?shù)表示為x/y ,你需要輸出最小的非負(fù)整數(shù) z 滿足 y×z≡x mod p。
輸入樣例 1:
2 998244353
輸出樣例 1:
2
輸入樣例 2:
100000000 998244353
輸出樣例 2:
3056898
(1分代碼)
(滿分代碼):大神的代碼
有不懂的問(wèn)題歡迎評(píng)論哦
總結(jié)
以上是生活随笔為你收集整理的第六届团队程序设计天梯赛 全题目解析讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 王者服务器维护8月四日,王者荣耀体验服弈
- 下一篇: 幼儿园不同空间翻新设计注意事项