題目意思:
有n個命令,要通過p個,某主席要在通過的p個中選擇k個接受。
每個任務有兩個值ai,bi, ai表示如果該主席接受該命令,她的頭髮變灰的數量,bi表示如果該主席不接受該命令時,議員不高興值。
對於通過的p個命令,該主席要使議員的不高興值和最小,在相同的情況下,要使自己的頭髮變灰的數量盡可能的少。
讓你求出通過哪p個命令,使得該主席的頭髮變灰的數量最多,在相同的情況下,輸出使議員不高興最大的選擇。
解題思路:
很好的一道貪心題目。
首先須知道,對於每乙個選擇(p命令),該主席一定是把b值最小的p-k個留下,如果有相同的,則盡可能使自己的頭髮變灰的數量最小。
為了先使該主席的suma最大,先按b從大到小排序,有相同的則按a從小到大排序。把後面p-k個留下,這樣就一定可以確保suma盡可能大,因為對於後面的b較小的p-k個,無論a有多大,如果選它都沒用,a不能發揮作用,所以只能從前n-(p-k)個裡選。所以再把前n-(p-k)個按a從大到小排序,如果a相等則按b從大到小(把小的b盡可能靠後,為了在相同的a的情況下,sumb盡可能的大)。選出前k個輸出(這就是最大的suma),然後在最大的suma的情況下,把最小的b的下標找到,然後對後面的所有小b的情況,按b從大到小排序,選出最大的p-k個。
標註紅顏色的那句話,很關鍵。如果b有相等的情況,如果按a從大到小排序,雖然這時候算出的suma可能更大,可是,當這樣的p個命令確定後,當b相同的情況下,該主席肯定會選a大的。所以這時算的suma就不準確,所以應該按a從小到大排序。
寫的有點囉嗦,但應該說清楚了。
主要思想:
當有兩個優先順序不同的限制條件時,先以第二優先順序的最壞的打算來保證第一優先順序,再在第一優先順序得到滿足條件下,來使得第二優先條件(本題是憤怒值最大)得到滿足。
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-6
#define inf 0x1f1f1f1f
#define pi acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/stack:1024000000,1024000000")
using namespace std;
/*freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/#define n 101000
int n,k,p;
struct inf
inf1[n],inf2[n];
bool cmp2(struct inf a,struct inf b)
bool cmp1(struct inf a,struct inf b)
{ if(a.bi!=b.bi)
return a.bi>b.bi;
return a.ai
貪心 好題 Yogurt factory
題目 任務規定,乙個酸奶製造廠,在n個星期內,分別要向外提供y i unit的酸奶。已知這個製造廠第i周製造每unit酸奶的費用為c i 儲存室儲存每1unit酸奶1星期的費用為s。問要完成這個任務的最小費用是多少。來自 思路 等價的思路,在第n天的時候,第n 2天製造的酸奶可以看成第n 1天製造的...
學習筆記 貪心好題!
這是一篇持續更新的部落格。不廢話了直接上題吧。1.洛谷 p2512 糖果傳遞 有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞乙個糖果代價為1。求使所有人獲得均等糖果的最小代價。題解 最終結果可以計算,記為s。我們假設所有傳遞都是向左傳遞 有向右的自然成為負數 設每個...
hdu4415 貪心好題
刺客殺人使用自己的刀需要消耗一定的耐久度,或者用殺人得到的刀,問用盡可能少的代價殺盡可能多的人 首先,如果殺了乙個有刀的人,最優解中有刀的人全部被殺完 證明 假設最優解中殺了x,不殺y,那麼殺了x後再殺y並不會使得自己的刀的數量有所減少,這種情況還多殺了乙個人,則這個不是最優解,矛盾了 將結果分為兩...