51Nod 1065 最小正子段和

2021-08-22 04:38:07 字數 1132 閱讀 8716

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,-2。-1,5,-2,-1,序列和為1,是最小的。

input

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

第2 - n+1行:n個整數

output

輸出最小正子段和。
input示例

84-1

5-2-12

6-2

output示例

1
題解:

先求出字首和和,對於每個位置求某個位置到當前位置和大於0的和的最小值。然而這是複雜度是o(n^2)的。其實可以通過排序優化到o(nlogn)。對字首和排序,然後比較相鄰兩項其位置關係,如果可以組成序列(即排序後的第幾項字首和的大小順序是 前小後大),則說明其可能是所要求結果,然後從所有可能是結果的結果中取出最小值即可。

解釋一下為什麼只需檢查相鄰2個數就可以,設abc是排序後的結果,如果a同b不能組成序列,而a同c可以組成序列,那麼b同c也可以組成序列,並且bc會是乙個更優的解。

ac**:

#includetypedef long long int ll;

using namespace std;

struct node

aum[50000+100];

int cmp(node x,node y)

sort(aum,aum+1+n,cmp); //排序的時候有 n+1 項 注意!

ll min=100000000;

for(int i=1;i<=n;i++)

}} cout

}

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。還有排序的時候如果有多個字首和相等,則把下標大的放在前邊,下標小的放後邊。比如輸...

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...