題意:給你乙個閉區間[a,b],求乙個最小的l,使得在區間[a,b-l+1]內任取乙個數x,可以滿足在x,x+1,x+2,……,x+l-2,x+l-1內至少包含k個素數。(1<=a,b,k<=10^6)
••考察內容:篩素數、二分
••一邊篩素數,一邊處理出乙個字首和sum
•sum(i)表示[1,i]中有多少素數
•那麼我們每次查詢區間[l,r]中有多少素數,直接查sum[r]-sum[l-1]就可以了
•接下去我們按照題意,對答案l進行二分就可以了
這是陶叔的解釋
我的解釋全在注釋裡頭了
#includeusingnamespace
std;
inta,b,k;
int sum[1000010];//
預設的值為0
int pri[1000010];//
篩選後的素數儲存在此陣列中
//篩選1-b的素數
void
init()
sum[i]++;//
否則就在前乙個的基礎上++
for(int j =i + i;j < 1000010;j+= i)//
把所有為i倍數的標記為1,代表非素數
}}//
檢測這個mid值是否滿足條件
bool check(int
mid)
}return1;
}int
main()
//採用二分法找l
int l = 1,r = b - a +1
,ans;
while(l <=r)
else
}cout
<< ans
}
重點還是要培養二分的意識
《ACM程式設計》 E題
問題描述 按照字串中字元排列的逆序數對多個字串進行排列,若兩個字串的逆序數相同,則按照輸入順序輸出。解題思路 簡化程式。將字串和它的逆序數組成乙個結構體,按照逆序數對結構體排序再輸出即可。其中。排序可用結構體來定義字元,解題心得 最後一行輸出完畢,不用換行,因為該錯誤導致多次提交失敗。做題時應注意細...
acm新手訓練題
問題描述 輸入三個字元後,按各字元的ascii碼從小到大的順序輸出這三個字元。輸入幾組字元進行測試。問題分析 將三個字元的ascll碼放入三個整型數中,然後同過三個整數的比較來實現字元的比較。解題步驟 開闢乙個字元空間 通過字元指標實現對字元的訪問,接著用while語句實現多組資料的輸入,在whil...
acm新手訓練題
問題描 述輸入一行數字,如果我們把這行數字中的 5 都看成空格,那麼就得到一行用空格分割的若干非負整數 可能有些整數以 0 開頭,這些頭部的 0 應該被忽略掉,除非這個整數就是由若干個 0 組成的,這時這個整數就是0 你的任務是 對這些分割得到的整數,依從小到大的順序排序輸出。input 輸入包含多...