51Nod 1065 最小正子段和

2022-05-01 22:48:15 字數 1527 閱讀 8371

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
對每一位來說,計算從第一位到該位置的數字的和。然後對這些和排序。

如果相近的位置上的node滿足其pos的前後關係,就比較最小值,因為是相近的,所以已經是最小值候選了,其餘的絕對不可能了,因為如果a到b不能形成佇列,a到c形成佇列了,那麼b到c一定是比a到c的數值更小,而且還一定能夠形成佇列(a與b不能形成佇列,說明posa>posb,a與c能形成佇列,說明posa

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#pragma comment(linker, "/stck:1024000000,1024000000")

#define lowbit(x) (x&(-x))

#define max(x,y) (x>=y?x:y)

#define min(x,y) (x<=y?x:y)

#define max 100000000000000000

#define mod 1000000007

#define pi acos(-1.0)

#define ei exp(1)

#define pi 3.1415926535897932384626433832

#define ios() ios::sync_with_stdio(true)

#define inf 0x3f3f3f3f

#define mem(a) ((a,0,sizeof(a)))typedef

long

long

ll;struct

node

}e[50006

];ll n,x;

intmain()

sort(e,e+n+1

); ll ans=inf;

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

printf(

"%lld\n

",ans);

return0;

}

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