ACM訓練二E題

2022-08-19 18:12:12 字數 896 閱讀 7783

題意:給你乙個閉區間[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進行二分就可以了

這是陶叔的解釋

我的解釋全在注釋裡頭了

#includeusing

namespace

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 輸入包含多...