題目:
今天講的貪心題,真神奇啊;
首先,要得到盡量多選隊友的解;
把隊友按 a[i] 從小到大排序,敵人按 b[i] 從小到大排序,然後對於每個隊友,選擇能攻擊的、收益最多的敵人;
如果沒有能攻擊的敵人,就把之前最小的乙個隊友踢掉代替,能使答案更優;
但盡量多選隊友不一定是最終的最優答案,因為有些價值很小(為負)的敵人不如不選;
所以需要調整,很妙的做法,就是直接踢掉最小的隊友和收益最小的敵人,那麼剩下的隊友和敵人也一定可以配對,過程中取最優解;
於是去寫了,然而秒wa,自己碼力好弱啊,打擊...
#include#include囧看看人家寫的簡潔優美ac**:#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;
}
然後就模仿著寫了;練習碼力...
**如下:
#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...