CF1020C Elections 列舉 貪心

2021-09-13 01:18:18 字數 1515 閱讀 5524

題目鏈結

這個題的背景是賄賂選民,從而讓自己的組織能夠上台.

自己組織的編號是1.

然後列出選民想要選的組織,以及收買他們的代價.

求最小代價.

第一行給出n,m,表示選民數量和組織數量,組織按照[1,2,3…m]編號,範圍都是[1,3000]

然後之後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...