51nod 1065 最小正子段和

2021-08-19 02:04:31 字數 1201 閱讀 1112

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),果斷 tle;

我們假設最小和的起點為i位置,終點在r位置,則對於字首和陣列p[maxn], p[j] - p[i - 1] >= p[r] - p[i - 1](j >= i),故對於以i為起點的元素,只需要獲得編號比i大且和最小的(大於p[i - 1])即可,故我們可以先按和公升序,最小和只可能在相鄰字首和間(注意先對字首和求最小正和再取相鄰合法差的最小正和)

ac**

#include #include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

const ll maxn = 55555, inf = 1e18;

struct nodep[maxn];

bool cmp(node a1, node a2)

int main()

sort(p, p + n, cmp);

for(ll i = 0; i < n - 1; i++)

if(p[i + 1].id > p[i].id && p[i + 1].val > p[i].val)

ans = min(p[i + 1].val - p[i].val, ans);

printf("%lld\n", ans);

return 0;

}

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