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,是最小的。
收起
第1行:整數序列的長度n(2 <= n <= 50000)第2 - n+1行:n個整數
輸出最小正子段和。
84-15-2-12
6-2
1思路:
先求一遍字首和,然後對於乙個數想辦法找他後面的數中大於他的最小值,他倆的差值就是結果。這裡用到set,倒著掃,對乙個數先用upper_bound找set中大於他的最小的元素,因為倒著掃的,所以這些元素都保證在他後面,找到他倆的差值與最優解做比較賦值給最優解。注意陣列從1開始讀,要倒著列舉要列舉0元素。因為列舉0號代表陣列從頭選,否則就會少了這一點。
ac**:
#include#includeusing namespace std;
typedef long long ll;
const int maxn=50010;
ll a[maxn];
setss;
set::iterator it;
int main()
ll ans=0x3f3f3f3f;
for(int i=n;i>=0;i--) }
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...