C C 程式設計學習 第21周 最短區間

2021-10-18 18:01:11 字數 1064 閱讀 2761

題目鏈結

現在給定乙個整數s以及乙個長度為n的整數數列a0,a1,a2,a3…an−1 (全為正數),

請你求出總和不小於s的連續子串行的長度的最小值。如果解不存在,則輸出0。

input

第一行:兩個整數,表示 s 與 n,其中1≤s≤109,1≤n≤500000; 第二行:n個用空格隔開的整數,表示 a0 a1 … an−1,其中對於任意ai有1≤ai≤109。

output

輸出總和不小於s的連續子串行的長度的最小值。 如果解不存在,則輸出0。

50

201089

31185

1111

208911

413229

6

4
尺取法。

根據題意是要找出一段連續的序列,使該段序列各個元素的和大於等於s,且該序列的長度最小。第一反應是暴力模擬,從第乙個元素開始,將該元素及之後長度依次增加地計算總和,如果和大於等於s,而且如果長度比之前小的話,就將此時的長度儲存為最小,依次迴圈,直到最後乙個元素。

但是由於資料量過大,這種方法雖然直觀,但是很耗時間。所以選取乙個更高效的演算法——尺取法。

尺取法: 就是設定兩個變數,就比如設定a和b,剛開始都指向0位置,然後a不動,b繼續向下指,每指一次就求一次和,直到b不能繼續向下指或和大於等於s。

當b沒有指向最後乙個元素而且和大於等於s時,再用現在a和b之間的長度與之前的長度比較取最小值。再從當前數字的和中減去a所指的數字,a再向下指一位,b繼續向下指。繼續重複上述過程 。

當b指向最後乙個元素而且此時和沒有大於s,那麼就跳出迴圈,因為已經不可能再找到大於等於s的序列範圍了。

c++**:

#include

using

namespace std;

int num[

500005];

intmain()

}if(len > n) len =0;

cout << len << endl;

}return0;

}

C C 程式設計學習 第18周 最長最短單詞

題目鏈結 輸入 1 行句子 不多於 200 個單詞,每個單詞長度不超過 100 只包含字母 空格和逗號。單詞由至少乙個連續的字母構成,空格和逗號都是單詞間的間隔。試輸出第 1 個最長的單詞和第 1 個最短單詞。輸入格式 一行句子。輸出格式 兩行輸出 第 1 行,第乙個最長的單詞。第 2 行,第乙個最...

C C 程式設計學習 第6周 A B問題

題目鏈結 相信你已經學會 a b 問題了,那麼問題又來了 輸入兩個正整數 a 和 b 求 a b。輸入格式 一行,包含兩個正整數 a 和 b,中間用單個空格隔開。1 a,b 50000。輸出格式 乙個整數,即 a b 的值。3 412注意int可能存不下,所以要開long long。c語言 incl...

C C 程式設計學習 第7周 合影效果

題目鏈結 蒜頭君和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的 所有人的身高都不同 輸入格式 第一行是人數 n 2 n 40,且至少有 1 個...