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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

切蛋糕(洛谷P1714)

發布時間:2023/12/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 切蛋糕(洛谷P1714) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

切蛋糕

題目描述

今天是小Z的生日,同學們為他帶來了一塊蛋糕。這塊蛋糕是一個長方體,被用不同色彩分成了N個相同的小塊,每小塊都有對應的幸運值。

小Z作為壽星,自然希望吃到的第一塊蛋糕的幸運值總和最大,但小Z最多又只能吃M小塊(M≤N)的蛋糕。

吃東西自然就不想思考了,于是小Z把這個任務扔給了學OI的你,請你幫他從這N小塊中找出連續的k塊蛋糕(k≤M),使得其上的幸運值最大。

輸入格式

輸入文件cake.in的第一行是兩個整數N,M。分別代表共有N小塊蛋糕,小Z最多只能吃M小塊。

第二行用空格隔開的N個整數,第i個整數Pi代表第i小塊蛋糕的幸運值。

輸出格式

輸出文件cake.out只有一行,一個整數,為小Z能夠得到的最大幸運值。

輸入 #1

5 2
1 2 3 4 5

輸出 #1

9

輸入 #2

6 3
1 -2 3 -4 5 -6

輸出 #2

5

一道單調隊列的題目,但是很難想到;我們首先要想到前綴和,當只能吃M塊時,這就是一道前綴和的裸題,但是M是不固定的,所以我們要想到對于 i 結尾的一個子區間,最大的區間和為s[i]=max(s[i]-s[j]),這時只要求出s[j]的最小值,j屬于【i-M,i-1】;那這里就能看出是一道單調隊列的題了,維護一個單調遞增的隊列;
代碼:

#include<bits/stdc++.h> using namespace std; int sum[500100]; int a[500100]; struct Node{int post,date; }sta[500100]; int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];//前綴和}int ans=0;int head=0;int M=-1e9;//可能有負數,設為負值 for(int i=1;i<=n;i++){while(head<=ans&&sta[ans].date>=sum[i]){ans--;//出隊 }sta[++ans].date=sum[i];//入隊 sta[ans].post=i;while(head<=ans){if(sta[head].post>=i-m&&sta[head].post<=i){M=max(M,sum[i]-sta[head].date);break;}else{head++;}}}printf("%d\n",M);return 0; }

總結

以上是生活随笔為你收集整理的切蛋糕(洛谷P1714)的全部內容,希望文章能夠幫你解決所遇到的問題。

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