bzoj4977 跳傘求生 貪心

2022-05-12 11:20:04 字數 1844 閱讀 9948

題目:

今天講的貪心題,真神奇啊;

首先,要得到盡量多選隊友的解;

把隊友按 a[i] 從小到大排序,敵人按 b[i] 從小到大排序,然後對於每個隊友,選擇能攻擊的、收益最多的敵人;

如果沒有能攻擊的敵人,就把之前最小的乙個隊友踢掉代替,能使答案更優;

但盡量多選隊友不一定是最終的最優答案,因為有些價值很小(為負)的敵人不如不選;

所以需要調整,很妙的做法,就是直接踢掉最小的隊友和收益最小的敵人,那麼剩下的隊友和敵人也一定可以配對,過程中取最優解;

於是去寫了,然而秒wa,自己碼力好弱啊,打擊...

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int

const maxn=1e5+5,inf=1e9;

intn,m,a[maxn];

ll ans;

bool vis[maxn],out

[maxn];

struct

n}p[maxn],t[maxn];

priority_queue

qen;

priority_queue

q2;priority_queue

q;bool cmp(n x,n y)

intmain()

if(!qen.size())

else

}for(int i=1;i<=n;i++)

if(!out[i])ans+=a[i]-t[i].b+t[i].c;

for(int i=1;i<=m;i++) if(vis[i])q2.push(p[i].b-p[i].c);

for(int i=1;i<=n;i++) if(!out[i])q.push(-a[i]);//

ll tmp=ans;

while(q.size()&&q2.size())

printf(

"%lld\n

",ans);

return0;

}

囧看看人家寫的簡潔優美ac**:

然後就模仿著寫了;練習碼力...

**如下:

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int

const maxn=1e5+5

;int

n,m,w[maxn],hd,tl;

ll ans,sum;

struct

n n(

int x=0,int y=0,bool t=0

):x(x),y(y),tp(t) {}

}t[maxn

<<1

];priority_queue

q;priority_queue

,greater >p;

intmain()

sort(t+1,t+n+1

); hd=1

;

for(int i=1;i<=n;i++)

}else}}

ans=sum;

for(int i=hd;i<=tl;i++)

printf(

"%lld\n

",ans);

return0;

}

bzoj4977 跳傘求生

有n個隊友和m個敵人,每個隊友有乙個攻擊力ai,每個敵人有攻擊力bi和價值ci。你可以選擇若干個隊友,每個隊友i去懟乙個敵人j i,j兩兩不同 當ai bj時,你的隊友可以對答案造成ai bj cj的貢獻。問答案最大可以是多少。n,m 100000 我首先往貪心方面想。考慮把隊友按a公升序排序,敵人...

bzoj2078 求樹的重心

時間限制 1 sec 記憶體限制 128 mb 樹的重心定義為樹的某個節點,當去掉該節點後,樹的各個連通分量中,節點數最多的連通分量其節點數達到最小值。樹可能存在多個重心。如下圖,當去掉點1後,樹將分成兩個連通塊 2,4,5 3,6,7 則最大的連通塊包含節點個數為3。若去掉點2,則樹將分成3個部分...

BZOJ 1001 最短路求最小割

對於這道題,是乙個裸的求一張圖最小割的問題,可是資料太大,dinic過不了,注意到題目中的圖是平面圖,因此我們可以通過將平面圖轉化為對偶圖的形式在對偶圖中跑最短路,這樣就可以用spfa或堆優化的dijkstra來做了 include include include includeusing name...