51Nod 1065 最小正子段和

2022-03-17 12:47:18 字數 656 閱讀 2744

知識點:  (void)

解題思路:

先記錄下序列的字首和及對應的位置,然後根據字首和從小到大排序,找出合理的兩個字首和之差最小的即可(所謂 「合理」 即是指大的字首和所對應的位置肯定要在小的字首和的後面,這樣二者之差才是這兩個位置之間的子段和)。有幾個點需要注意:1、題目要求的是正子段和,所以除了讓答案盡可能小之外還要大於0;2、要新增乙個字首和為0、位置為0的項,否則無法取序列中的單項。

ac**:

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4 typedef pairint>p;

5const

int maxn = 50000+4;6

const ll inf=0x7fffffff;7

ll a[maxn];

8p sum[maxn];

9int

main()23}

24 printf("

%lld\n

",ans);

2526

return0;

27 }

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