51nod1065 最小正子段和

2021-09-11 03:22:04 字數 820 閱讀 1576

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,是最小的。

思路:這道題用樹狀陣列t3個點,不知道怎麼優化索性看題解,看15ms答案都是按字首和排序,然後比較位置關係,如果可以組成序列,則說明可能是結果,從裡面取最小值即可。

#include#define inf 0x3f3f3f3f

#define ll long long

#define mem(ar,num) memset(ar,num,sizeof(ar))

#define me(ar) memset(ar,0,sizeof(ar))

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

#define ios ios::sync_with_stdio(false)

#define debug cout}

return a.sum < b.sum;

}int main()

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

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

if(no[i + 1].a > no[i].a && no[i + 1].sum - no[i].sum > 0)

ans = min(ans, (no[i + 1].sum - no[i].sum));

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