1. 程式人生 > >參加浙江中醫藥大學第十一屆程式設計競賽(ACM賽制)的總結

參加浙江中醫藥大學第十一屆程式設計競賽(ACM賽制)的總結

前言

2017.12.10,浙江中醫藥大學主辦了一場acm賽制的比賽(浙江中醫藥大學第十一屆程式設計競賽),而我和我們學校(杭州二中白馬湖學校)的另外兩名同學組成一隊也去參加了,這是我打的第一場acm比賽,和傳統的oi比賽不同,acm賽制的形式不一樣,題目型別也不一樣。

規則介紹

這場比賽的規則和傳統acm大致相同,只是在時間的方面不一樣。這場比賽一共四個小時(傳統五個小時),有11題編號分別為a~k。比賽以隊伍的形式參加,人數為1~3人,每隊只能使用一臺電腦。每a掉1題就可以獲得1個氣球,不同的題目有不同顏色的氣球,另外的,每一題的一血隊伍能獲得一個金色帶著題號的氣球。

比賽進行時

一開始,我們商定好了每個人開哪幾個編號的題目,我要開的是C題,一看到題目,我就有了思路,於是先開始打了起來

C題(尋找zcmu)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=2
題意簡介:多組資料,每組資料一個長度不超過100000的字串,讓你在其中找到一種方案,刪去最少的字元時得串中出現一段連續的字元“zcmu”。
解決方法:顯然這是一道dp題,dp[i][j]表示終點為i,包含目標串的前j個字母的最靠後的起點位置,滾動一維陣列,就很好寫啦

當然,最後我A掉了C題
在我打C題的過程中,另外兩名隊員先大致看了一遍其它的題,找到了2道水題,一道是E題,一道是G題

E題(Pizza)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=4
題意簡介:很玄乎的題目,但是隻要分析以後就可以發現答案其實就是輸出輸入的k,多組資料
解決方法:對於每組資料輸入一個整數,輸出這個數

G題也很水

G題(特產)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=6
題意簡介:一個人出遊時空箱子重量為a,回來時重量為b,問他在旅遊過程中買了多重的東西,輸入2個實數,輸出一個整數
解決方法

:用double讀入,輸出時用.0lf就好了,這是b-a problem

隨後我們由一位同學來打樹鏈剖分的一道模板題A題

A題(不存在的樹)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=0
題意簡介:樹上的路徑上求max、求和並支援單點修改
解決方法:樹鏈剖分

那位同學很給力,這一題也A了
在那位同學打A題程式碼的時候,我和另外一個同學推出了B題

B題(一生之敵)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=1
題意簡介:多組資料,每組輸入一個非負整數 n(n<=11019) ,求一個最小的大於n的b滿足 2a(a+1)2=b2(a,bZ)
解決方法:即要滿足 2a(a+1)2 是完全平方數,那麼顯然 a 一定滿足 a=2x2(xZ) 可以發現x和a的單調性相同,所以說只要二分這個x就好了,另外要注意的是要用unsigned long long,否則會爆,還有要特判0的情況,否則二分容易陷入死迴圈

接下來呢,我們又有一個同學一眼秒了J題

J題(序列)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=9
題意簡介:給定兩個長度為n(n<=100000)的序列a,b,讓你求有序數對 <i,j> 的數量滿足ai=bj且gcd(i,j)=1
解決方法:經典做法,用容斥,顯然只滿足第一個條件的很好統計,然後再減去gcd(i,j)大於1的滿足條件有序數對數量就好了

在後面,我們又切了F題

F題(開心的cc)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=5
題意簡介:多組資料,給定一個長度為n(n<=100000)的1、-1的串,串可以複製以後加到後面,求1~n中能作為起點滿足從起點開始的長度為n的串的字首和為正
解決方法:考慮用一個單調佇列來維護字首和的從小到大的值,若單調佇列的最小值大於0則計入答案即可

比賽過去三個小時了,有很多隊伍A掉了D題,然而我們隊卻還沒有,怎麼辦呢,我們想了很久,一直沒有想出來,最後換了一個思路,最終做了出來

D題(cc的神奇揹包)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=3
題意簡介:多組資料,你有一個揹包,初始容量為v,你有n個物品(n<=1000),第i個物品需要佔用ai的空間,並且如果成功放入,揹包會多出bi的空間,問能否放入所有的的物品
解決方法:首先,如果某個物品的ai<=bi並且放的進去,那麼就貪心的放進去,讓揹包擴容,然後呢剩下的物品用倒推的方法,先計算出如果所有物品都成功放入最後揹包還剩的體積vlas,那麼倒推最後一個放的物品x,vlas一定大於等於bx,那麼可以倒推vlas1位vlas-bx+ax,若發現不能倒推了且還有物品沒被用掉,那麼就說明不行,否則就可以

最後我們隊還剩三題沒有A,分別是H、I、K,我H題可能會做了,我有一個同學會做K題,I題是一道字串的比較繁的題
我就在說一下H題吧,至少我大致是會的

H題(剪紙)

題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=7
題意簡介:輸入n(4<=n<10),代表一個n*n的正方形,你要用一條折線把這個正方形分成面積相同的兩半,問方案數(旋轉相同算同一種方案)
解決方法:如果n是奇數,那麼面積也是奇數,方案數為0,那麼根據資料範圍也就是隻要分別知道n=4、6、8時的方案數就好了,那麼怎麼算呢,可以爆搜,可是n=8時怎麼辦呢, 264 顯然受不了啊,那麼可以縮小問題規模
先說我的複雜度,是 O2(n2)n/2(n2)n/2 的,當n=8時複雜度為402653184,大概只要跑4s
首先呢先假設兩半的顏色一半黑一半白,那麼靠兩邊各的一列分別都是一種顏色的,顯然不證。那麼考慮只要搜中間的一大塊的一半就好了,另一半是中心對稱的,那麼就指數列舉,在加判斷,只要是所有黑色都和左邊聯通,所有白色都和右邊聯通,這個很好判斷,還有要注意的是儘管只枚舉了一半,但是還是要考慮上下的情況,這個也很好處理,連著前面的用並查集就好

剩下的題:
I題(Memory leak)題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=8
K題(追求者)題目網址:http://acm.zcmu.edu.cn/JudgeOnline/problem.php?cid=1214&pid=8
有興趣的讀者可以去做一做哦

總結

感覺這一次三個人配合的很好,然後呢D題出的很慢,導致最後題目來不及碼程式碼很可惜
這套題目給我的感覺是,如果能把題意轉化一下很多題目就不是那麼難了
然後呢,打acm比賽團結協作很重要分配好時間和人力,這樣才能多拿分
總榜網址:http://acm.zcmu.edu.cn/JudgeOnline/contestrank.php?cid=1214
我們隊拿了rank6,可能罰時偏多了