最近一直在找題訓練,想要更加系統的補補思維,補補漏洞什麼的,以避免被個類似於腦筋急轉彎的題目幹倒,於是在四處找書,找了紅書、藍書,似乎都有些不盡如人意。這兩天看到了日本人的白書,重新讀了一遍,其中若干章節寫的非常務實也實踐起來相當實用,於是這就是白書上面一道推薦的題目,用於訓練尺取法的例題。考慮到最近老是讀錯題,所以就慢慢習慣於首先把個題目翻譯成中文之後在進行解讀:
傑西卡是個非常可愛的女孩子,因而有若干男孩子追她,最近他的考試要到了,她需要花相當多部分的時間在這件事情上面,吐過他想通過考試,那麼她就必須把所有的只是點都熟悉透,但是寫教科書的人似乎十分在意一些奇怪的東西,於是他將將有的知道hisian重複了若干次。傑西卡童鞋希望知道她最少需要看多少頁連續的書才能夠完成她的複習進度。乙個愛慕她的男孩子已經把每一頁的知識點使用獨立的編號標示了出來,但是他並不能夠很好的完成這個統計工作,所以你收到的聘用。
傳統意義上如果我們要列舉連續的片段將會幾乎必然花費n2的時間來進行這個列舉,但是根據尺取法的思路,我們並沒有必要完全的列舉每種集合(如果他們顯然不合理的的話),此時的思路是,首先設定乙個游標,使得游標在慢慢往後移動這代表了整個區間的結束位置,沒到達乙個點,將記錄該點在區間中的出現次數,如果之前沒有出現過,則應當給cnt變數加上1,如果此時cnt變數等於所有知識點的總數,則應開始移動開始端的游標,每到一處則減少1.。
但是這道題有些坑:
1,及即使關了同步,cin也會因為太慢而超時。
2,因為輸入整個只有一行,所以關同步這個操作會使得scanf無法讀取到全部所有的資料。
於是注釋掉關同步的行,cin換成scanf就可以了。
詳見**:
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
long
long maxn=1000000+233
;int
arr[maxn];
intnumb[maxn];
intcntt[maxn];
int ans=maxn;
intn;
sets;
void
init()
sort(numb,numb+pp);
int spos=-1;int cnt=0
;
for(int i=0;ii)
}cout
<"\n"
;
}int
main()
回味尺取法(下)例題 poj3320
例題 題目大意 jessica開始讀一本很厚的書,需要把書中所有知識點都掌握,這本書總共p頁,第i頁恰好有乙個知識點ai,每個知識點都有乙個整數編號 全書中同乙個知識點可能會被多次提到,所以他希望通過閱讀其中連續的一些頁把所有的知識點都覆蓋到,給定沒有人寫到的知識點,求出閱讀的最少頁數。樣例 p 5...
POJ 2100(尺取法 巢狀pair)
題意 結界給出乙個數n。你要求一段連續的數,這些數的平方和等於n。input 輸入乙個整數n,1 n 10 14 output 輸出乙個數k,k為解的個數。接下來的k行為解,每一行的解要先輸出這個解中包含的數字個數,然後從小到大輸出解中包含的數字。解的輸出順序要按照所包含的數字個數降序排列。samp...
POJ2566(尺取法 字首和)
題意 給出乙個整數列,求一段子串行之和最接近所給出的t。輸出該段子序列之和及左右端點。思路 做這道題其實是沒思路的,看了大佬的題解後學習到了。一般來說,我們必須要保證數列單調性,才能使用尺取法。預處理出前i個數的字首和,和編號i一起放入pair中,然而根據字首和大小進行排序。由於abs sum i ...