日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod 1115 最大M子段和 V3

發布時間:2025/3/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod 1115 最大M子段和 V3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
環形最大M子段和,N個整數組成的序列排成一個環,a[1],a[2],a[3],…,a[n](a[n-1], a[n], a[1]也可以算作1段),將這N個數劃分為互不相交的M個子段,并且這M個子段的和是最大的。如果M >= N個數中正數的個數,那么輸出所有正數的和。 例如:-2 11 -4 13 -5 6 -1,分為2段,6 -1 -2 11一段,13一段,和為27。 ?收起

輸入

第1行:2個數N和M,中間用空格分隔。N為整數的個數,M為劃分為多少段。(2 <= N , M <= 100000) 第2 - N+1行:N個整數 (-10^9 <= a[i] <= 10^9)

輸出

輸出這個最大和

輸入樣例

7 2 -2 11 -4 13 -5 6 -2

輸出樣例

26

相比v2,改成首尾相接的,如果首尾同號就歸并。
代碼: #include <iostream> #include <cstdlib> #include <cstdio> #include <set> using namespace std; typedef long long ll; int n,m; ll d,last; ll s[100005]; int l[100005],r[100005]; int sc; void modify(int cur) {///修改左右相鄰結點的下標int ll = l[cur],rr = r[cur];r[ll] = rr;l[rr] = ll; } int main() {while(~scanf("%d%d",&n,&m)) {sc = last = 0;ll sum = 0,ans = 0,c = 0;set<pair<ll,int> > ss;for(int i = 0;i < n;i ++) {scanf("%lld",&d);if(d * last < 0) {s[++ sc] = sum;sum = d;}else sum += d;last = d;}if(sum) s[++ sc] = sum;if(s[1] > 0 && s[sc] > 0 || s[1] < 0 && s[sc] < 0) {s[1] += s[sc --];}for(int i = 1;i <= sc;i ++) {ss.insert(make_pair(abs(s[i]),i));c += s[i] > 0;ans += (s[i] > 0 ? s[i] : 0);l[i] = i - 1;r[i] = i + 1;}r[sc] = 1;l[1] = sc;while(c > m) {int cur = ss.begin() -> second;ss.erase(ss.begin());ans -= abs(s[cur]);s[cur] += s[l[cur]] + s[r[cur]];ss.erase(make_pair(abs(s[l[cur]]),l[cur]));modify(l[cur]);ss.erase(make_pair(abs(s[r[cur]]),r[cur]));modify(r[cur]);if(s[cur]) ss.insert(make_pair(abs(s[cur]),cur));c --;}printf("%lld\n",ans);}return 0; }

?

轉載于:https://www.cnblogs.com/8023spz/p/10912467.html

總結

以上是生活随笔為你收集整理的51nod 1115 最大M子段和 V3的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。