最小正子段和

2021-10-16 16:52:45 字數 794 閱讀 6099

n個整數組成的序列a1,a2,a3,…,an,從中選出乙個子段(ai,ai+1,…aj),使這個子段的和》0,並且這個和是所有和》0的子段中最小的。

例如:4,-1,5,-2,-1,2,6,-2。-1,5,-2,-1,序列和為1,是最小的。

input

第1行:整數序列的長度n(2 <= n <= 50000) 第2 - n+1行:n個整數

output

輸出最小正子段和。

sample input

84-1

5-2-12

6-2

sample output

思路:暴力可解,o(n^2)直接列舉每乙個字段加字首和

但會超時,我們會發現任意兩個字首和的差都代表了乙個子段的和,只要兩個字首和之差比較小,那麼他就可能是答案,所有我們要盡可能的找到這樣的字首和, 我們發現只要將字首和進行排序,相鄰兩項的差就是最小的。但也要保證組成的了正序的序列。具體細節參考**

#include

using

namespace std;

#define ll long long

const

int n =

5e4+10;

int n, a[n]

;ll sum[n]

;struct node

}v[n]

;int

main()

cout << ans << endl;

}

1065 最小正子段和(字首和,暴力)

n個整數組成的序列a 1 a 2 a 3 a n 從中選出乙個子段 a i a i 1 a j 使這個子段的和 0,並且這個和是所有和 0的子串行中最小的。例如 4,1,5,2,1,2,6,2。1,5,2,1,序列和為1,是最小的。輸入第1行 整數序列的長度n 2 n 50000 第2 n 1行 n...

51nod 1065 最小正子段和

1065 最小正子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 從中選出乙個子串行 a i a i 1 a j 使這個子串行的和 0,並且這個和是所有和 0的子串行中最小的。例如 4,1,5,2,1,2,6...

51nod 1065 最小正子段和

求字首和,然後公升序排序。排序後相鄰兩個字首和只差越小,比如prefixsum i 1 假設他原來座標是n,和prefixsum i 假設他原來座標是m,他倆差越小,則表明區間 m,n 之間的正整數和越小,前提是n m。還有排序的時候如果有多個字首和相等,則把下標大的放在前邊,下標小的放後邊。比如輸...