Problem A: Modular multiplication of polynomials
A題是一道模擬題,主要考察選手?jǐn)?shù)組的和循環(huán)控制的運(yùn)用能力。
題目要求模擬的是多項(xiàng)式除法,且給出了具體的運(yùn)算規(guī)則,異或運(yùn)算。給出f(x),g(x)兩個(gè)多項(xiàng)式相乘,然后除以h(x)多項(xiàng)式,求其余數(shù)(亦為多項(xiàng)式)。先用兩重循環(huán)將f(x),g(x)相乘,用一數(shù)組記錄相乘后多項(xiàng)式k(x)的x^i的系數(shù),然后做多項(xiàng)式除法。設(shè)被除數(shù)的最高次為x^n, 除數(shù)h(x)的最高次為y^m, 直到n<m時(shí)候循環(huán)結(jié)束。
Problem B:Checking an Alibi
這題其實(shí)就是求每個(gè)點(diǎn)到1號(hào)點(diǎn)的最短路。 然后判斷每只牛所在地到1號(hào)點(diǎn)的需時(shí)是否小于等于M.
題目沒(méi)明確說(shuō)有沒(méi)有重邊,一般情況下是要考慮的。 在比賽時(shí),我們認(rèn)為數(shù)據(jù)中有長(zhǎng)度為0的邊,與題目中1-70000不符。但ACM就是這樣,題目出問(wèn)題是常有的事。在確定自己程序沒(méi)錯(cuò)的前提下,選手們只能考經(jīng)驗(yàn)和感覺(jué)去猜。
Problem C:The Game of Mafia
直接搜索就行了,白天和黑夜輪著搜,注意一下只剩下他自己的時(shí)候的情況就可以了。
Problem D:Multiplication Puzzle
這題是經(jīng)典的動(dòng)態(tài)規(guī)劃。
用a[1000]表示愿數(shù)組,d[i][j]表示讓第i個(gè)數(shù)與第j個(gè)數(shù)碰面(刪掉他們之間的元素)的最小代價(jià)。
方程是:
d[i][j]= max(d[i][k]+d[k][j]+a[k]*a[i]*a[j],i<k<j)
時(shí)間復(fù)雜度是O(n^3)。
Problem E:Zip
這題有兩種操作A和B
對(duì)于操作A來(lái)說(shuō)只要統(tǒng)計(jì)一下各種字母出現(xiàn)的次數(shù)就可以很容易得到S'了
而對(duì)于操作B來(lái)說(shuō)統(tǒng)計(jì)一下序列S'的各種字母的出現(xiàn)次數(shù),然后根據(jù)p就可以得到序列的第一個(gè)字母和第二個(gè)字母,然后根據(jù)根據(jù)第一個(gè)字母就可以得到最后一個(gè)字母
比如對(duì)于樣例來(lái)說(shuō):
xelpame 7
a x
e e
e l
l p
m a
p m
x e
確實(shí)了第二個(gè)字母是x,第一個(gè)字母是e,e出現(xiàn)第一次的時(shí)候就可以得到最后一個(gè)字母是e,
所以根據(jù)最后一個(gè)字母倒過(guò)來(lái)生成前面的序列,從對(duì)應(yīng)e的最后一次出現(xiàn),可以得到倒數(shù)第二個(gè)字母是l,然后對(duì)于l最后出現(xiàn)一次,可以確實(shí)l前面是p,然后一直填上去就可以得到原序列S=example
Promble F: Wall
F題考察的是選手基本的計(jì)算幾何知識(shí)。
讀懂題意后就是求凸包的周長(zhǎng)+一個(gè)圓的周長(zhǎng), 求凸包可以先選取最左下角的點(diǎn),然后以該點(diǎn)為基準(zhǔn)對(duì)所有點(diǎn)作極角排序,然后就是用Graham掃描法求凸包了。
Problem G:Ouroboros Snake
這題可以用構(gòu)造算法。 題目有一個(gè)限制,2^N 個(gè)數(shù)不重不漏的出現(xiàn),這就是關(guān)鍵所在。可以想到,必然有N個(gè)零連著,這就是要求數(shù)列的開(kāi)始(以后不可能有N個(gè)零連著了)。然后我們每次取后面N-1位,加0看看前是否有這N位。有,那么這一位不能是0(要不就違反了不重不漏了),只能是1。否則就加0。
但是僅僅這樣并不能得出正確的答案。 怎么辦呢?
想到這個(gè)構(gòu)造算法的結(jié)尾必然是很多個(gè)1連著(因?yàn)榧?的話,這N位在前面出現(xiàn)過(guò)了)。理想的情況是N個(gè)1。那么象 1000,1100,1110這些前面全是1,后面全是0的數(shù)就在首尾相接(這是一個(gè)圓環(huán))的時(shí)候出現(xiàn)了。
修正辦法立刻有了,就是在一開(kāi)始時(shí)把象 1000,1100,1110這些前面全是1,后面全是0的數(shù)標(biāo)志為已經(jīng)出現(xiàn)過(guò)。然后用我們之前說(shuō)的那種構(gòu)造法一位位的確定那一位是0還是1。
經(jīng)過(guò)檢驗(yàn),發(fā)現(xiàn)這樣就符合要求了。
posted on 2007-04-29 01:18
豪 閱讀(672)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
算法&ACM