又到了諾德縣的百姓孝敬夾克大老爺的日子,帶著數量不等的銅板的村民準時聚集到了村口。
夾克老爺是一位很」善良」的老爺,為了體現他的仁慈,有一套特別的收錢的技巧。
1、讓所有的村民排成一隊,然後首尾相接排成乙個圈。
2、選擇一位村民收下他的銅錢,然後放過他左右兩邊的村民。
3、讓上述三位村民離開隊伍,並讓左右兩邊的其他村民合攏起來繼續圍成乙個圈。
4、重複執行2、3直到村民全部離開。
夾克老爺的家丁早早的組織村民排成一隊並清點了村民人數和他們手裡的銅錢數量。
作為夾克老爺的首席師爺,你要負責按照夾克老爺的收錢技巧完成納貢的任務。
聰明的你當然知道夾克老爺並不像他表現出來的那樣仁慈,能否收到最多的錢財決定了你是否能夠繼續坐穩首席師爺的位置。
今年村民的人數是n,恰巧是3的倍數。
input
第一行1個整數n(3 <= n <= 10^5 - 1, n % 3 == 0)
第2 - n + 1行:每行1個數對應村民i手中的銅錢。(0 <= m[i] <= 10^9)
output
乙個整數,說明在夾克老爺的收錢規則下你最多能夠為夾克老爺搜刮到多少銅錢
input示例
6 6
2 3
4 5
9output示例
13一看到題,就想起了2023年的一道聯考題「怎樣打好隔膜」,但是那道題更難,還有好多連線不連續點的傳送門,連打個爆搜都是npc……
而這道題要簡單些,一次只處理連續的民。如果我們只想到了貪心,一定會先收下錢最多的村民的錢。用優先佇列維護即可。但這樣的貪心顯然不能證明……
其實在貪心的基礎上,再加一步模擬退流就可以了。如果我們選了乙個村民i,收走了他的錢ai
,就可以把他的錢數更新為al
eft[
i]+ari
ght[
i]-a
i 。其中left[i]和right[i]分別表示和i村民相鄰的兩個村民。這樣再選上這個點時,就相當於不選i而選與i相鄰的村民,這樣就能保證正確性(其實我也沒證過)。
**
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef pairint> pa;
priority_queueq1,q2;
ll a[600010];
int next[300010],pre[300010];
int tp()
return q1.top().second;
}void del(pa x1)
int main()
int numm=n/3;
ll ans=0;
for (int i=1;i<=numm;i++)
else
}int pr=pre[x],ne=next[x];
pre[x]=pre[pr];
next[x]=next[ne];
pre[next[x]]=x;
next[pre[x]]=x;
a[x]=a[pr]+a[ne]-a[x];
q1.push(make_pair(a[x],x));
q2.push(make_pair(a[ne],ne));
q2.push(make_pair(a[pr],pr));
}printf("%lld\n",ans);
return
0;}
51Nod 1380 夾克老爺的逢三抽一
acm模版 首先發一下官方題解吧 按照官方題解寫的 發現自己一直在第 21 組資料 tl e 很明顯,這組資料是後來加上去專門卡資料的。於是發現自己的 中忽略了乙個部分是暴力的思維,在查詢左右兩側可選的村民時,我用了兩個迴圈,這顯然是不行的,所以我需要使用鍊錶的思維,這樣查詢的複雜度就是 o 1 了...
51nod 1380 夾克老爺的逢三抽一
又到了諾德縣的百姓孝敬夾克大老爺的日子,帶著數量不等的銅板的村民準時聚集到了村口。夾克老爺是一位很 善良 的老爺,為了體現他的仁慈,有一套特別的收錢的技巧。1 讓所有的村民排成一隊,然後首尾相接排成乙個圈。2 選擇一位村民收下他的銅錢,然後放過他左右兩邊的村民。3 讓上述三位村民離開隊伍,並讓左右兩...
51nod 1380 夾克老爺的逢三抽一
題目 題解 設最大值為b,左邊為a,右邊為c 解釋一下為什麼要把a c b放回去 因為b不一定是最優的,說不定a c和b差不多大,同時選a c可能比b更優,把a c b放回去,若再次取出,則相當於用兩次選了a和c,滿足題意,也滿足貪心 include using namespace std type...