1. 程式人生 > >[Codeforces 1070F]Debate(貪心)

[Codeforces 1070F]Debate(貪心)

Address

洛谷 RemoteJudge
Codeforces 1070F

Meaning

  • Alice 和 Bob 參加選舉
  • n n 個投票人,第 i i
    個人有兩個屬性 s i s_i a i
    a_i
  • 對於第 i i 個人, s i
    s_i
    是一個長度為 2 2 01 01
  • s i = 00 s_i=00 表示第 i i 個人不支援 Alice 和 Bob
  • s i = 01 s_i=01 表示第 i i 個人不支援 Alice 但支援 Bob
  • s i = 10 s_i=10 表示第 i i 個人支援 Alice 但不支援 Bob
  • s i = 11 s_i=11 表示第 i i 個人支援 Alice 和 Bob
  • i i 個人的影響力為 a i a_i
  • 現在要從中選出一些人,滿足下面 2 2 個條件
  • (1)選出的人中,支援 Alice 的人數的 2 2 倍大於或等於選出的人數
  • (2)選出的人中,支援 Bob 的人數的 2 2 倍大於或等於選出的人數
  • 求選出的人的影響力之和的最大值

Solution

  • 考慮把所有投票人按照 s i s_i 分開,顯然在最優方案中 s i = 11 s_i=11 的投票人必須被選出
  • 然後重點對 00 00 01 01 10 10 進行分析
  • 一個結論:在最優方案中,所有 s i = 01 s_i=01 的投票人全部被選出,或者所有 s i = 10 s_i=10 的投票人全部被選出
  • 證明:如果有一種合法方案,有 x x s i = 01 s_i=01 的投票人沒被選出,有 y y s i = 10 s_i=10 的投票人沒被選出
  • 那麼再選 min ( x , y ) \min(x,y) s i = 01 s_i=01 的投票人和 min ( x , y ) \min(x,y) s i = 10 s_i=10 的投票人則顯然還是合法
  • 下面對 s i = 01 s_i=01 的投票人全部被選出的情況進行討論( s i = 10 s_i=10 的投票人全部被選出的情況同理)
  • 先把 s i = 10 s_i=10 的投票人按照 a i a_i 進行排序並求影響力的字首和
  • s i = 00 s_i=00 的投票人幹同樣的事情
  • 下面設 n x n_x s i = x s_i=x 的投票人個數
  • 列舉 s i = 10 s_i=10 的投票人選出的個數 k k
  • 那麼如果 n 11 + k < n 01 n_{11}+k<n_{01} (支援 Alice 的人太少)或者 n 11 + n 01 < k n_{11}+n_{01}<k (支援 Bob 的人太少)則這個 k k 不合法
  • 否則之多可以選擇 min ( n 00 , n 11 + k n 01 , n 11 + n 01 k ) \min(n_{00},n_{11}+k-n_{01},n_{11}+n_{01}-k) s i = 00 s_i=00 的投票人
  • 上式 min \min 內第一個引數為 s i = 00 s_i=00 的人數,第二個引數表示支援 Alice 1人數減去不支援 Alice 的人數(換句話說,表示最多還能有多少個人不支援 Alice ),第三個引數表示最多還能有多少個人不支援 Bob 。
  • 顯然在 s i = 00 s_i=00 的人中選出一些以及在 s i = 10