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