codeforces 731E 優先佇列 DP

2021-07-23 19:43:14 字數 1110 閱讀 1341

題意:給出n個數字,a和b兩個人依次選中1−

k(k≥

2),把他們合併之後自己分數加上這些數的和。求兩個人在最右策略下a最多領先b多少。當數字只剩下乙個之後遊戲馬上結束。 用

dp[i

][0/

1]表示前i個數字被合併,現在是a/b先手到最後遊戲結束最多領先多少。故a要最大化後繼狀態的值,b要最小化後繼狀態的值,轉移就很顯然了:dp

[i][

0]=m

axdp[

i][1

]=mi

n

其中sum陣列是a陣列的字首和。因為每次都用乙個最大/小值去更新,所以用兩個單調佇列維護dp

[i][

1]+s

um[i

] 和dp

[i][

0]+s

um[i

] 即可。

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 200005

long

long dp[maxn][2], a[maxn], sum[maxn];

int n;

priority_queue long> q1;

struct node

};priority_queue q2;

int main ()

dp[n][0] = dp[n][1] = 0;

while (!q1.empty ()) q1.pop (); while (!q2.empty ()) q2.pop ();

q1.push (dp[n][1]+sum[n]);

q2.push ((node) );

for (int i = n-1; i >= 1; i--) );

}cout

<< dp[1][0] << endl;

return

0;}

codeforces 731C 並查集 水

題意 給出n只襪子的顏色,每天選擇兩隻襪子,每次能把乙隻襪子染色。問最少染色幾隻襪子能使的每天的襪子顏色一樣。給每天穿的兩隻襪子連邊,很顯然乙個分量的襪子要一起考慮,並查集維護分量就好了。然後搜出最多的顏色,把分量的點都染成這個顏色即可。include include include include...

動態規劃(Funny Game,cf 731E)

參考 blog.csdn.net sdfzyhx article details 52832832 第一步是要確定狀態,dp i 表示前i個縮成一堆的情況下先手的最大值。dp i 表示前i個縮成一堆很好想,關鍵是表示什麼的值。題目要求求先手的最大值,因此表示此值十分合理。然後是狀態轉移,自己做的時候...

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...