阿狸和桃子正在玩乙個遊戲,遊戲是在乙個帶權圖g=(v, e)上進行的,設節點權值為w(v),邊權為c(e)。遊戲規則是這樣的:
阿狸和桃子輪流將圖中的頂點染色,阿狸會將頂點染成紅色,桃子會將頂點染成粉色。已經被染過色的點不能再染了,而且每一輪都必須給乙個且僅乙個頂點染色。
為了保證公平性,節點的個數n為偶數。
經過n/2輪遊戲之後,兩人都得到了乙個頂點集合。對於頂點集合s,得分計算方式為
\[\sum_w(v) + \sum_c(e)
\]由於阿狸石頭剪子布輸給了桃子,所以桃子先染色。兩人都想要使自己的分數比對方多,且多得越多越好。如果兩人都是採用最優策略的,求最終桃子的分數減去阿狸的分數。
\(n\leq 10000,m\leq 100000\)。
太頂了這道題 orz。
直接把邊權除以二分別加到所連線的兩個點上,然後排序從大到小取即可。
因為我們需要求的是分數差,所以如果所連線的兩個點不屬於同乙個人,就會相減消掉,否則相加變為恰好一倍貢獻。
時間複雜度 \(o(m+n\log n)\)。
#include using namespace std;
const int n=10010;
int n,m,ans,a[n];
int main()
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)
ans+=((i&1)?-1:1)*a[i];
printf("%d",ans/2);
return 0;
}
P4643 國家集訓隊 阿狸和桃子的遊戲
把邊權轉換為點權。具體來說,把一條邊的邊權各一半加到兩個頂點上,然後每個人選的時候,貪心的選取點權最大的點即可。如果一條邊的兩個頂點被同乙個人選上了,那麼它就會額外提供等同於邊權的貢獻 否則的話,兩個人每人都有一半邊權的收益,相當於這條邊誰也沒給,也是符合題意的。include include in...
P4643 國家集訓隊 阿狸和桃子的遊戲
miku 貪心,只有點權的時候顯然好做,但是還有邊權怎麼辦呢 假設這裡有一條邊,邊權為2v,然後兩個點的點權為a,b,我們把邊權分成兩部分,然後平攤到兩個點上,那麼 邊權變成了a v,b v 假如一人選了乙個選了 那麼a v b v 和a b一樣。同理,假如兩個都歸了乙個人,那麼a v b v和 a...
思維 Luogu P4643 阿狸和桃子的遊戲
阿狸和桃子正在玩乙個遊戲,遊戲是在乙個帶權圖g v,e 上進行的,設節點權值為w v 邊權為c e 遊戲規則是這樣的 阿狸和桃子輪流將圖中的頂點染色,阿狸會將頂點染成紅色,桃子會將頂點染成粉色。已經被染過色的點不能再染了,而且每一輪都必須給乙個且僅乙個頂點染色。為了保證公平性,節點的個數n為偶數。經...