題目鏈結
這個題的背景是賄賂選民,從而讓自己的組織能夠上台.第一行給出n,m,表示選民數量和組織數量,組織按照[1,2,3…m]編號,範圍都是[1,3000]自己組織的編號是1.
然後列出選民想要選的組織,以及收買他們的代價.
求最小代價.
然後之後n行選民,每一行給出p,c,表示此位選民想投的組織和收買的代價 , 1<=p輸出最小代價
這個題如果直接做,會發現不太好貪心,雖說是肯定優先選取代價最小的選民,但是如果目前只有乙個組織在我黨前面,那麼或許收買她的選民比收買其他黨的選民更划算(可見原題樣例2),這樣就造成了貪心的困難
我們再觀察題目,發現n,m的範圍都很小,不過3e3,所以我們可以考慮列舉我黨想要到達的票數,我們假設票數是(k+1)(此處設計方便之後計算)然後我們朝著這個方向貪心,即對於其他黨,如果票大於k,我們就按照代價遞增的順序收買其選民,使之票數等於k,我們將所有這種黨處理過後,看票數是否到達了k+1,如果到達了,則處理結束,輸出答案即可;如果尚未到達,則從所有選民中按照遞增的順序收買,收買過程中注意標記,避免同乙個選民收買兩次,當到達k+1時,輸出答案
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
bool vis[
4000];
struct peo };
bool cmp
(peo &a, peo &b)
intmain()
else
}sort
(a.begin()
, a.
end(
), cmp)
;for
(int i =
1; i <= m;
++i)
ll mincost = static_cast<
long
long
int>
(1e18+7
);for(
int k =
0; k < n;
++k)
t += newticket;
}int pos =0;
while
(t + sum <= k)
++pos;
} mincost =
min(mincost, ans);}
printf
("%i64d\n"
, mincost)
;return0;
}
類似之前的那個小丑和藝術家的題目(cf1138b),我感覺太過忽略了列舉在解數學題中的作用,尤其是在資料範圍小的題目上更顯得巧妙 CF1020B Badge 模擬鍊錶
n個點 n 1000 接下來n個整數表示ai 第i個數ai表示i到ai有一條邊 輸出 n個數 表示從第i個點出發,最先被訪問兩次的點 樣例1 從1 出發,先到達2,2會到達3,3又到達2.2被訪問第二次。輸出 2 從2 出發,先到達3,3到達2,2被訪問兩次,輸出 2 從3 出發,先到2 2 又到3...
CodeForces 1020C(貪心,列舉)
題目 列舉票數,如果比當前票數大就收買,之後再遍歷一遍,如果超過當前的列舉就結束 比如你現在列舉到2,當前3票的人有三個,直接判斷答案 不足當前列舉的票數就補上。以為列舉的票數就是實際的票數,其實可能不止。列舉的票數其實感覺更像是列舉層數,遍歷全部總會遍歷到臨界點 唉,這種題做的還是少了,看了別人之...
PAT乙級1020(C語言)
月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量 總售價 以及市場的最大需求量,請你計算可以獲得的最大收益是多少。注意 銷售時允許取出一部分庫存。樣例給出的情形是這樣的 假如我們有 3 種月餅,其庫存量分別為 18 15 10 萬噸,總售價分別為 7...