10.19 qbxt国庆day3
最近的題都莫名簡(jiǎn)單
經(jīng)常AK
煉金術(shù)
【問題描述】
即使是最偉大的ACM選手也是需要足夠的金錢來把妹的的。于是ZYB發(fā)明了一臺(tái)煉金機(jī)器.
這臺(tái)機(jī)器一共有三個(gè)功能:
1.能把a(bǔ)位沙子變成b位石油.
2.能把c位石油變成d位金子.
3.能把e位金子變成f位沙子.
值得注意的是你并不需要用整單位的物品進(jìn)行兌換,例如你可以利用0.1 沙子來兌換0.1 石油。
然而現(xiàn)在ZYB里手只有10^100的沙子,他想考考你,他能否得到無窮多的金子?
【輸入格式】
從文件 a.in 中讀入數(shù)據(jù)。
第一行一個(gè)正整數(shù)T,表示數(shù)據(jù)組數(shù).
接下來T行,每行6個(gè)整數(shù)a_i,b_i,c_i,d_i,e_i,f_i.
【輸出格式】
輸出到文件 a.out 中。
對(duì)于每組數(shù)據(jù),如果ZYB能產(chǎn)生無窮多的金子就輸出YES,否則輸出NO.
【樣例輸入】
(本題樣例輸入輸出有10萬組,這里取前6組作為展示)
6 198 226 169 343 676 825 0 74 904 423 852 249 250 613 912 549 515 76 20 783 0 670 874 494 382 908 220 930 343 51 226 608 97 969 740 630【樣例輸出】
YES YES NO YES YES YES【數(shù)據(jù)規(guī)模】
對(duì)于50%的數(shù)據(jù),所有數(shù)都不為0.
對(duì)于50%的數(shù)據(jù),沒有任何限制。
以上的數(shù)據(jù)檔互不相交.
對(duì)于所有的數(shù)據(jù),滿足\(1\le T\le100000, 0\le a,b,c,d,e,f\le1000\).
【題解】
如果我們有1的沙子,可以變成\(\displaystyle\frac b a\)的石油,進(jìn)而可以變成\(\displaystyle\frac{bd}{ac}\)的金子,進(jìn)而可以變成\(\displaystyle\frac{bdf}{ace}\)的沙子。如果\(bdf>ace\)那么就可以進(jìn)入高產(chǎn)循環(huán),進(jìn)而能產(chǎn)生無限金子。
但是當(dāng)他們中有0呢?我們從根源來考慮問題:
- 如果d=0,因?yàn)槟銢]有金子,而且你無法產(chǎn)生金子,所以你無法得到金子。
- d不等于0:
- 如果c=0,那么你可以從沒有石油無中生有出金子,所以能產(chǎn)生無限金子嘍。
- 如果c不等于0,那么石油可以轉(zhuǎn)化為金子,你有了無限石油就有了無限金子。
- 我們?cè)俜治鍪?#xff0c;如果b=0,那么你不能產(chǎn)生石油,所以你無法得到金子。
- 如果b不等于0:那么就能產(chǎn)生石油了。
- 如果a=0,那么你可以產(chǎn)生無限石油,進(jìn)而產(chǎn)生無限金子。
- 如果a不等于0:繼續(xù)分析,那么您就能從沙子轉(zhuǎn)化為金子
- 我們繼續(xù)分析沙子,如果f=0,那么如果你想要產(chǎn)生無限金子,你是需要把沙子再轉(zhuǎn)化成沙子的,顯然現(xiàn)在不可以,所以就不能
- 如果f不等于0:你就能轉(zhuǎn)化出沙子
- 如果e=0,那么你就有無限沙子,從而無限石油,從而就有無限金子
- 如果e不等于0,就是六個(gè)值都不等于0,那么就套用上面的式子即可。
神仙題。。。。。。。。。。。。。
矩陣循環(huán)
【問題描述】
給出一個(gè)N行M列的01矩陣,現(xiàn)在我們每次可以將某一行整體循環(huán)左移一位,或者將某一行整體循環(huán)右移一位.(例如11000循環(huán)右移一位會(huì)變成01100,而循環(huán)左移一位會(huì)變成10001)現(xiàn)在要求你用最少的步數(shù),來使得這個(gè)矩陣?yán)镏辽儆幸涣腥慷际?.為了方便你只需要輸出這個(gè)步數(shù)。
【輸入格式】
從文件 b.in 中讀入數(shù)據(jù)。
第一行兩個(gè)整數(shù)N,M,描述矩陣的大小。
接下來?,每行一個(gè)長(zhǎng)度為M的01串。
【輸出格式】
輸出到文件 b.out 中。
一行輸出答案.如果無論如何也不存在解就輸出?1.
【樣例輸入】
3 6 101010 000100 100000【樣例輸出】
3【數(shù)據(jù)規(guī)模】
對(duì)于30%的數(shù)據(jù),N,M≤ 5.
對(duì)于20%的數(shù)據(jù),每行至多有一個(gè)1.
對(duì)于20%的數(shù)據(jù),M≤ 100
對(duì)于30%的數(shù)據(jù),沒有任何限制。
以上的數(shù)據(jù)檔互不相交.
對(duì)于所有的數(shù)據(jù),滿足1 ≤ N ≤ 100, 1 ≤ M ≤ 10^4.
【題解】
處理一個(gè)數(shù)組,f[i][j]表示讓第i行第j列有1(別的列不管),第i行需要旋轉(zhuǎn)的次數(shù)
讓所有1的位置bfs即可
GMPotlc提供了更好的做法:維護(hù)一個(gè)向左一個(gè)向右然后取min(但是好像需要開三倍數(shù)組)
每一列的f相加為讓最后所有1在這一列上的答案
答案為所有列取min
注意如果有一行全是0,那么肯定無解,那么這一行的f設(shè)成0x3f3f3f3f即可,其實(shí)有更好的做法一開始直接判斷。
最短路
【問題描述】
你來到了一個(gè)陌生的世界,這個(gè)世界,是一座完整的城市。
這座城市由N條東西向和M條南北向的街道構(gòu)成,分別標(biāo)號(hào)為1, 2, ...., N,兩邊都是一樣。令(x,y)為第x條南北向街道和第y條東西向街道構(gòu)成的交點(diǎn)。
在這座城市,街道之間的距離基本都是固定,且只會(huì)是1或者5.第i條南北向街道與第i+1條南北向街道的距離是D_i,第i條東西向街道與第i+1條東西向街道的距離是E_i。
初來乍到,第一件該做的事情就是熟悉街道。你一共熟悉了Q天街道,每天從(Sx,Sy)跑到(Ex,Ey).你只能夠沿著街道走,并且不能跑到邊界之外(最邊上的街道就是邊界).同時(shí),這個(gè)城市有個(gè)奇怪的規(guī)定,若你正在走一條南北向的街道,到下一個(gè)路口,就必須走東西向的街道。(具體看圖,注意圖中的不一定是最優(yōu)解).
其實(shí)題面少一句:若你正在走一條東西向的街道,到下一個(gè)路口,就必須走南北向的街道。這句話在樣例1中沒有體現(xiàn),但在樣例2(下面的樣例2為評(píng)測(cè)時(shí)的第一個(gè)測(cè)試點(diǎn))中體現(xiàn)了。如果沒有這句話,第三題的答案應(yīng)該為11而非13(by ghj1222)
現(xiàn)在你想知道,對(duì)于這Q天每天你最少需要走多少距離。
【輸入格式】
從文件 c.in 中讀入數(shù)據(jù)。
第一行,兩個(gè)正整數(shù)n,Q.
第二行,N-1個(gè)整數(shù)D_i.
第三行,N-1個(gè)整數(shù)E_i.
接下來Q行,每行四個(gè)正整數(shù)Sx,Sy,Ex,Ey.
【輸出格式】
輸出到文件 c.out 中。
Q行,,每行一個(gè)整數(shù).
【樣例輸入1】
10 3 5 1 5 5 5 1 1 5 5 1 5 5 5 1 5 5 1 5 4 3 9 10 9 2 2 9 5 1 5 10【樣例輸出1】
46 50 49【樣例輸入2】
5 5 1 5 1 5 1 1 1 5 3 3 2 1 2 4 3 1 4 4 5 5 2 2 5 2 5 4 3 2【樣例輸出2】
7 10 10 13 8【數(shù)據(jù)規(guī)模】
對(duì)于10%的數(shù)據(jù),\(N,Q\le5\).
對(duì)于30%的數(shù)據(jù),\(N,Q\le100\).
對(duì)于60%的數(shù)據(jù),\(N,Q\le1000\).
對(duì)于100%的數(shù)據(jù),\(1\le N,Q\le100000,1\le Sx,Sy,Ex,Ey\le N\).
【題解】
大水題。。。
可以當(dāng)做最短路做,可以拆點(diǎn),也可以連斜邊(by olinr)
注意到交換Sx和Ex,交換Sy和Ey答案不變
其實(shí)橫縱坐標(biāo)是分開的
我們?cè)O(shè)dx=|Ex-Sx|,dy=|Ey-Sy|,那么如果|dx-dy|<=1,那么可以直接走過去而不用繞遠(yuǎn)。處理出橫縱坐標(biāo)前綴和直接輸出即可。
那么如果大于1呢?我們假設(shè)dx-dy>1(dy-dx>1同理不寫了),那么說明在x坐標(biāo)上走的比較長(zhǎng),因?yàn)樾枰惶娴淖?#xff0c;所以y坐標(biāo)上需要繞遠(yuǎn)一下。我們把從Sy到Ey的稱為基礎(chǔ)的路程,那么剩下就是繞遠(yuǎn)的路程了。我們繞遠(yuǎn)繞一個(gè)來回,那么不難推出有\(\displaystyle\frac{dx-dy}{2}\)個(gè)來回。設(shè)他為rest。
由于我們要找最短距離,所以盡量繞小的,也就是1的格子。
如果從Sy到Ey中途有1那么就太棒了,直接在中途繞就行了。答案為rest*2
如果從Sy到Ey中途沒有1,那么有兩種解決方案:
一是在中途繞長(zhǎng)度為5的格子。。。rest*10
二是離開Sy到Ey的區(qū)間取區(qū)間外面尋求長(zhǎng)度為1的格子。假設(shè)我們?cè)趨^(qū)間外部走了dis的距離,走到了一個(gè)臨近長(zhǎng)度為1的格子的格點(diǎn),那么答案為dis*10+(rest-dis)*2。注意可能出現(xiàn)rest-dis<0的情況,就是我們走不到一個(gè)長(zhǎng)度為1的格子,那么暴力一點(diǎn)直接和0取max,
答案為這兩種情況取min呢
那么怎么求dis呢?怎么判斷區(qū)間里是否有1呢
我們預(yù)處理一個(gè)數(shù)組lx[i]和rx[i],表示i向左/右走能走到長(zhǎng)度為1的格子需要走的距離。如果i這個(gè)點(diǎn)與一個(gè)長(zhǎng)度為1的格子相鄰,那么lx[i]=rx[i]=0。這個(gè)數(shù)組不難用O(N)的復(fù)雜度遞推出來。
對(duì)于一個(gè)區(qū)間,處理出兩個(gè)端點(diǎn)的l和r,其中dis為左端點(diǎn)l和右端點(diǎn)r取min,如果左端點(diǎn)r和右端點(diǎn)l小于等于區(qū)間長(zhǎng)度(事實(shí)上這兩個(gè)同時(shí)滿足或同時(shí)不滿足)那么就有1在區(qū)間內(nèi)。
轉(zhuǎn)載于:https://www.cnblogs.com/oier/p/9816484.html
總結(jié)
以上是生活随笔為你收集整理的10.19 qbxt国庆day3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。