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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

长度不超过n的连续最大和___优先队列

發(fā)布時(shí)間:2023/12/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 长度不超过n的连续最大和___优先队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:

https://nanti.jisuanke.com/t/36116

題目:

在蒜廠年會(huì)上有一個(gè)抽獎(jiǎng),在一個(gè)環(huán)形的桌子上,有?nn?個(gè)紙團(tuán),每個(gè)紙團(tuán)上寫一個(gè)數(shù)字,表示你可以獲得多少蒜幣。但是這個(gè)游戲比較坑,里面竟然有負(fù)數(shù),表示你要支付多少蒜幣。因?yàn)檫@些數(shù)字都是可見的,所以大家都是不會(huì)出現(xiàn)的賠的情況。

游戲規(guī)則:每人只能抓一次,只能抓取一段連續(xù)的紙團(tuán),所有紙團(tuán)上的數(shù)字和就是你可以獲得的蒜幣。

蒜頭君作為蒜廠的一員在想,我怎么可以獲得最多的蒜幣呢?最多能獲取多少蒜幣呢?

因?yàn)槟陼?huì)是發(fā)獎(jiǎng),那么一定有大于?00?的紙團(tuán)。

輸入格式

第一行輸入一個(gè)整數(shù)?nn,表示有?nn?個(gè)紙團(tuán)。

第二行輸入輸入?nn?個(gè)整數(shù)?a_iai?,表示每個(gè)紙團(tuán)上面寫的數(shù)字(這些紙團(tuán)的輸入順序就是環(huán)形桌上紙團(tuán)的擺放順序)。

輸出格式

輸出一個(gè)整數(shù),表示蒜頭君最多能獲取多少蒜幣。

數(shù)據(jù)范圍

對(duì)于?30\%30%?的數(shù)據(jù):1 \le n \le 10^2,-10^3 \le a_i \le 10^31n102,?103ai?103。

對(duì)于?60\%60%?的數(shù)據(jù):1 \le n \le 5 \times 10^3,-10^6 \le a_i \le 10^61n5×103,?106ai?106。

對(duì)于?100\%100%?的數(shù)據(jù):1 \le n \le 10^5,-10^9 \le a_i \le 10^91n105,?109ai?109。

樣例輸入

?3

1 -2 1

樣例輸出

2

題目來源

2019 藍(lán)橋杯省賽 B 組模擬賽(一)

?

?

分析: 求循環(huán)的連續(xù)最大和.

? ?循環(huán)好解決:? ?把數(shù)組首尾連成2n長的.

? 然后就是求長度不超過n的最大連續(xù)和.

? 一般求連續(xù)和 直接用前綴和,然后逐步做差即可.

?但是這兒有個(gè)限制,要求長度不超過n. 所以我們可以用優(yōu)先隊(duì)列:

? 維護(hù)一個(gè)結(jié)構(gòu)體?

?struct node {

  ll val;

? ? ? ?int index;

};

?根據(jù)index判斷一下長度是否超過n即可.

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5+50;ll arr[maxn * 2];struct node {ll val;int index;bool operator < (const node &a) const {if (val != a.val) return val > a.val;return index > a.index;}node () {}node (ll vv, int ii) : val(vv), index(ii) {} };int main() {ios::sync_with_stdio(false);int n;cin >> n;for (int i=0; i<n; ++i)cin >> arr[i];for (int i=n; i<2*n; ++i)arr[i] = arr[i-n];for (int i=1; i<2*n; ++i)arr[i] = arr[i] + arr[i-1];ll res = -8626213631111ll;ll tans;priority_queue<node> pq;for (int i=0; i<2 * n; ++i) {if (pq.empty()) tans = arr[i];if (tans > res) res = tans;while (!pq.empty()) {node tmp = pq.top();if (i - tmp.index >= n) {pq.pop();continue;} else {tans = arr[i] - tmp.val;break;}}if (tans > res) res = tans;pq.push({arr[i], i});}cout << res << endl;return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/cgjh/p/10343581.html

總結(jié)

以上是生活随笔為你收集整理的长度不超过n的连续最大和___优先队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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