51Nod 1065 最小正子段和

2021-08-22 18:08:02 字數 1024 閱讀 5645

題目:

n個整數組成的序列a11,a22,a33,…,ann,從中選出乙個子串行(aii,ai+1i+1,…ajj),使這個子串行的和》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

1
解題思路:不知道為啥,看到第一眼就行去尺取,emmm,然而我不會,在t了一次後,發現直接暴力史過不去的,所以就轉化了一下思路,就是用字首和求解,並且儲存下標,然後以字首和排序,這樣就能滿足相鄰兩位之間肯定是最小的子段和,當滿足下標呈增大趨勢時。

ac**:

#include#include#include#include#define maxn 500005

using namespace std;

typedef long long ll;

int n;

struct nodenum[maxn];

//ll num[maxn];

bool cmp(const node a,const node b)

num[0].pos=0;

num[0].sum=0;

sort(num,num+n+1,cmp);

ll ans=0;

int flag=1;

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

else if(ans>num[i].sum-num[i-1].sum)

ans=num[i].sum-num[i-1].sum;}}

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