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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

又一最大子段和

發(fā)布時(shí)間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又一最大子段和 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

又一最大子段和(牛客小白月賽38 )

題意:

我們將一個(gè)數(shù)列{an}的最大字段和的值記為S(a),現(xiàn)在你可以對(duì)進(jìn)行若干次操作,每次操作,你可以選擇數(shù)列中的一個(gè)數(shù)字,將其改為[?10100,10100][-10^{100},10^{100}][?10100,10100]之間的任意一個(gè)數(shù)。現(xiàn)在,給定整數(shù)x,求最少操作多少次可以使得S(a)=x
最大子段和是指選出數(shù)列中連續(xù)且非空的一段使得這段的和最大。

題解:

若S(a)=x,操作次數(shù)就是0
若S(a)<x,操作次數(shù)就是1,因?yàn)槲覀兛梢宰屪畲笞佣魏椭械哪骋粋€(gè)元素加上(x-s(a))
若S(a)>x是最難想的,我們先想另一個(gè)問(wèn)題:最少改多少個(gè)元素可以讓S(a)<x?如果按照貪心的做法,當(dāng)算上當(dāng)前位第i位之后>x時(shí),我們就要把第i位給改成負(fù)無(wú)窮(?10100-10^{100}?10100),這樣就可以使得S(a)一定小于x,這樣的操作次數(shù)記為ans1,現(xiàn)在每段都是小于x的,就變成了第二個(gè)情況,我們?cè)俨僮饕淮尉涂梢缘扔趚,拿答案就是ans1+1。但實(shí)際上,這個(gè)1是可以省略的。
我們通過(guò)ans1次操作,將ans1個(gè)數(shù)改成極小值,這樣相當(dāng)于隔開(kāi)好幾份,每份sumisum_{i}sumi?都小于x,那我們可以將兩個(gè)相鄰的sum1和sum2合并起來(lái),讓他們等于x,這可以通過(guò)k值來(lái)實(shí)現(xiàn),我們讓k取x-(sum1+sum2),這樣sum1+k+sum2不就等于k了,其他ans1-1個(gè)位置依舊取負(fù)無(wú)窮

代碼:

#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N = 400010; int main() { int _;cin>>_;while(_--){int n,x;cin>>n>>x;vector<ll>dp(n+1,0);ll maxv=-1e18;int cnt=0;for(int i=1;i<=n;i++){int xx;cin>>xx;dp[i]=xx;if(dp[i-1]>0) dp[i]+=dp[i-1];maxv=max(maxv,dp[i]);if(dp[i]>x){dp[i]-=1e18;cnt++;}}if(maxv==x) cout<<0<<endl;else if(maxv>x) cout<<cnt<<endl;else cout<<1<<endl;} return 0;} /** * In every life we have some trouble * When you worry you make it double * Don't worry,be happy. **/

總結(jié)

以上是生活随笔為你收集整理的又一最大子段和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。