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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P4597 序列sequence

發布時間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4597 序列sequence 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

?

題解

完全看不懂大佬們在說什么……特別是chen_zhe大佬寫的……

來說說個人的理解吧

大佬們說:考慮當前的數$x$和之前的最大數$y$,(默認$x<y$,因為如果$x>=y$已經滿足非降了)為了讓它非降,我們要在區間$[x,y]$里找到一個數$z$,使$y$減小到$z$,$x$增大到$z$,那么可以發現,不管取的數是什么,代價都是$y-x$

不難看出,$y$減小的越多,后面的序列越容易變成非降,那么只要讓$y$減小到$x$就好了

看到這里,我一直有一個疑問,如果令$y$減小到$x$之后,序列不滿足非降了怎么辦?

仔細想了想,實際上應該是這樣的:為了讓序列非降,$y$不能小于$y$之前的最大值。而由于$y$是整個序列的最大值,如果它之前的最大值$z$小于等于$x$,那么將$y$減小到$x$仍能保證序列是非降的。否則的話,$z$大于$x$小于$y$,仍是在區間$[x,y]$內,那么移動的代價是$y-x$,所以用于更新答案是沒有問題的

那么這里為什么要讓$y$減到最小呢?這是因為$x$和$y$不論如何調整,他們的代價之和都已經不變了,但問題是他們目前選的最優方案并不是之后的最優。為了滿足他們在之后最優,只有把$y$減小到$x$,才能保證之后更有可能非降。

概括一下,對于當前的數,無論最優解如何,對答案的貢獻是一定的。而為了保證之后的解也最優,令$y$減小到$x$,可以保證之后的解最優,且不會影響當前的最優解

代碼好短……

1 //minamoto 2 #include<cstdio> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 inline int read(){ 9 #define num ch-'0' 10 char ch;bool flag=0;int res; 11 while(!isdigit(ch=getc())) 12 (ch=='-')&&(flag=true); 13 for(res=num;isdigit(ch=getc());res=res*10+num); 14 (flag)&&(res=-res); 15 #undef num 16 return res; 17 } 18 priority_queue<int> q; 19 int n;long long ans; 20 int main(){ 21 n=read(); 22 while(n--){ 23 int x=read();q.push(x); 24 if(x<q.top()){ 25 ans+=q.top()-x; 26 q.pop();q.push(x); 27 } 28 } 29 printf("%lld\n",ans); 30 return 0; 31 }

?

轉載于:https://www.cnblogs.com/bztMinamoto/p/9462864.html

總結

以上是生活随笔為你收集整理的P4597 序列sequence的全部內容,希望文章能夠幫你解決所遇到的問題。

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