Codeforces Round 894 (Div. 3)(A-G)思路講解文字版
題目大意:給你n列元素,如果你能從中選出4列元素,使得從左到右的四列滿足,第一列存在'v'字符,第二列存在'i'字符,第三列存在'k'字符,第四列存在'a'字符。你輸出”YES“,否則你輸入”NO"。
輸入描述:輸入n,m代表有多少行和有多少列,然后輸入每一行的元素。1<=n,m<=20
輸出描述:輸出"YES"或者“NO”描述是否存在這種選擇
思路分析:首先每一列出現(xiàn)多少元素都是可以得到的。同時考慮貪心,我們?nèi)魶]有出現(xiàn)我們需要的字符,那么我們應(yīng)該在當(dāng)前位置就要選擇,換句話說,就是我們需要一個元素,我們就找到這個元素下一次出現(xiàn)的位置,保證了從左到右的四列滿足"vika"。
我的做法很麻煩,大家也可以直接去寫暴力的做法會快很多。
題目大意:對于一個數(shù)組a,我們會將其中所有的元素都放入到b數(shù)組中,現(xiàn)在告知我們b數(shù)組,希望我們還原一個a數(shù)組,同時要求a數(shù)組的長度不能是b數(shù)組長度的兩倍。a數(shù)組的答案有很多,輸出一種即可。
輸入描述:第一行n描述數(shù)組b的長度,第二行描述整個數(shù)組b的值,注意數(shù)組b中的元素滿足
.
輸出描述:輸出數(shù)組a的長度,輸出數(shù)組a,注意數(shù)組a中的元素應(yīng)該滿足
思路分析:可以發(fā)現(xiàn)對于一個數(shù)組b,當(dāng)還原為數(shù)組a的時候,我們只用考慮當(dāng)前的的關(guān)系,對其分類討論,可以發(fā)現(xiàn)當(dāng)
的時候,顯然中間可以添加任何數(shù)字,當(dāng)
的時候,顯然b_i前面應(yīng)該有一個小于等于他的數(shù)字x,那么我們可以將
和
中間添加一個數(shù)字x。
C題:
題面描述:給你一個長度為n的數(shù)組a,描述每一個位置上放置多高的矩形,例如[5,4,3,2,1],如下圖:

如果我們構(gòu)造出來的整個圖形對于y=x這個函數(shù)是對稱的,那么我們輸出“YES”,否則輸出“NO”。
輸入描述:第一行n代表數(shù)組的長度,第二行,代表每個位置放多高的矩形。
輸出描述:存在關(guān)于y=x對稱輸出“YES”,否則輸出“NO”。
思路分析:對于一個圖形分析,我們可以分析矩形,然后對于一個矩形去求出他關(guān)于y=x翻轉(zhuǎn)之后的位置,顯然關(guān)于y=x翻轉(zhuǎn)之后,會交換x和y坐標(biāo)。然后再分析當(dāng)前位置是否在原來也有,所以可以直接用while循環(huán)去找相對應(yīng)的位置,對于這個問題大家可以去算一下[3,1,1]的情況,就可以搞明白了。
代碼部分:
D題:
題面描述:現(xiàn)在有一個人想要吃n種口味的冰激凌,冰激凌需要用兩種原料制作,比如使用1和2,可以注意到在這種情況下可以制造出{1,2}的冰激凌和{2,1}的冰激凌,但是對于這兩個冰激凌,我們認(rèn)為是同一種。同樣我們也可以制造出{1,1}這種冰激凌?,F(xiàn)在這個人需要恰好n種口味的冰激凌,問你最少需要選擇多少個原料(原料數(shù)量不分種類)。
注意:這題的一個原料比如2可以和原料3或者原料1,分別組成{2,3}和{1,2}兩種口味,但是如果想要組成{2,2}口味的話必須要再買一個原料2.
輸入描述:輸入n,表示當(dāng)前恰好需要的冰激凌種類數(shù)量。
輸出描述:輸出我們需要購買多少種原料。
例子解釋:
對于n=2的情況,我們可以購買[1,1,2]這樣組合,恰好2種口味,答案為3.
思路分析:首先我們將{1,2}這種靠兩種原料制造的冰激凌稱之為混合冰激凌,對于{1,1}這種只靠一種原料制造的冰激凌稱之為原味冰激凌,可以發(fā)現(xiàn)除掉原味冰激凌的情況,那么對于當(dāng)前有n個原料,那么會存在種混合冰激凌,那么再考慮原味冰激凌,發(fā)現(xiàn)增加一個原料最多只會增加一個原味冰激凌,也就是n個原料,最多多出來n個原味冰激凌,那么我們就可以湊出來恰好的答案。同時,由于盡量多做混合冰激凌,對增加種類提升更大,所以具有單調(diào)性質(zhì),可以二分解決問題。
代碼部分:
E題:
題面描述,給你一個長度為n的數(shù)組a,其中代表你每次出去開心可以獲得的快樂值?,F(xiàn)在一共有n天,你最多出去開心m次,如果你很久沒有出去開心的話,那么你下次出去開心收獲的快樂值就需要減去中間沒開心的天數(shù)再乘上數(shù)值d?,F(xiàn)在請問你可以獲得的最大快樂值為多少。
輸入描述:第一行輸入n,m,d,為上述所介紹,第二行輸入。a中的數(shù)值可以為負(fù)數(shù)
輸出描述:輸出可以獲得的最大快樂值。
例子解釋:
5 2 2
3 2 5 4 6
對于這個例子我們選擇第一天去開心一下,得到貢獻(xiàn)為3-1*2=1。
然后我們在第三天出去開心一下,得到貢獻(xiàn)為5-2*2=1。
最后得到的最大快樂值為2。
思路分析:首先我們可以發(fā)現(xiàn)如果我們選擇了最后一次出去開心的日子,那么我們實(shí)際上就確定了d要減去的快樂值,那么我們可以利用優(yōu)先隊(duì)列去維護(hù)每次選擇的日子中提供快樂值最高的幾天,當(dāng)后面訪問到新的點(diǎn),如果提供的快樂值不如之前選擇最差的那么我們一定不需要它。在遍歷的過程中不斷計算,更新答案即可。
代碼部分:
F題:
題面描述:現(xiàn)在有n個怪獸,每個怪獸的生命值為,你是一名女巫(美少女),每秒你可以回復(fù)火焰魔力w點(diǎn),回復(fù)寒冰魔力f點(diǎn),你的魔力可以一直儲存。然后你需要利用這些魔力消滅怪獸,消滅過程為,你消耗火焰或者寒冰魔力
點(diǎn)去殺死第i個怪獸,再準(zhǔn)確點(diǎn)說,你需要一擊斃命怪獸?,F(xiàn)在請你告訴美少女,她到底最少要等待多少秒才能擊殺所有怪獸。
注意:消滅怪獸并不花費(fèi)時間
輸入描述:第一行輸入w,f如同題目所述,第二行輸入n,怪獸的數(shù)量,第三行輸入怪獸們的血量。
輸出描述:輸出最少要等待多少秒。
思路分析:首先我們發(fā)現(xiàn),對于時間,時間越長,肯定越可以消滅完所有的怪獸,所以存在單調(diào)性,可以考慮二分。然后思考當(dāng)我們知道火焰魔力和寒冰魔力的值,我們考慮一部分全用火焰魔法解決,對于其他怪獸用寒冰魔法解決。同樣的這里存在單調(diào)性,用火焰魔法解決的越多越好,那么只要計算出怪獸血量的組合,那么選擇最大可以解決組合給火焰魔法解決,再分析剩下的可以不可以用寒冰魔法消滅。計算怪獸血量組合的部分代碼可以使用bitset解決。
代碼部分:
G題:
(最逆天的題面,我感覺昨晚看懂題目都花了我很長時間)
題面描述:現(xiàn)在給你一個長度為n的數(shù)組a,然后你獲得一個神奇的物件,這個物件會這樣計算這個數(shù)組的答案:
計算過程:1.對當(dāng)前數(shù)組進(jìn)行排序,如果只有一個元素就輸出這個元素,退出循環(huán)。
? ? ? ? ? ? ? ? ? 2.刪除數(shù)組中的重復(fù)元素,每個元素只保留一個。
? ? ? ? ? ? ? ? ? 3.當(dāng)前數(shù)組長度為n,第一個數(shù)字+n,第二個數(shù)字+n-1,.....,最后一個數(shù)字+1.
? ? ? ? ? ? ? ? ? 4.重復(fù)這個操作。
然后有q次詢問,每次詢問將第a個位置的值更改成b(會對后面詢問產(chǎn)生影響),然后你需要輸入這個數(shù)組的答案。
輸入描述:輸入n,以及數(shù)組中的內(nèi)容,輸入q,a,b。
輸出描述:輸出修改后數(shù)組的答案。
例子解釋:

思路分析:首先大家可以去看一下例子解釋,已經(jīng)其中的操作,可以發(fā)現(xiàn)對于兩個相鄰的值,如果他們要相等,一定得要經(jīng)過他們差值的輪數(shù),那么實(shí)際上最大的值最后變成的答案就是這個輪數(shù)加上最大值,因?yàn)樽詈笠粋€值只會增加1。所以現(xiàn)在的問題轉(zhuǎn)變?yōu)椋航鉀Q在線修改值,并且重新計算排序之后的兩個數(shù)之間的差值最大值。對于這個問題很好想到的是,我們刪除一個元素,實(shí)際上他改變的情況沒有很多,可以細(xì)想一下,也就是減少和左邊的差值,和右邊的差值,以及增加一個左右的差值,然后把新改的值添加,也是同理,每次我們刪除和增加的數(shù)值其實(shí)很少,那么我們只要找到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)解決問題即可,這里可以使用multiset具體操作和set是類似的,multiset內(nèi)部元素有序,允許出現(xiàn)重復(fù)元素,添加和刪除操作的都是logn,具體的操作可以看下面的代碼。
代碼部分(由于cf機(jī)子死掉了,我不確定我寫的有沒有細(xì)節(jié)問題,所以給大家放了jiangly大佬的代碼,寫的還是非常簡介,真的是太強(qiáng)了)