description
jsoi資訊學代表隊一共有n名候選人,這些候選人從1到n編號。方便起見,jyy的編號是0號。每個候選人都由一位
編號比他小的候選人ri推薦。如果ri=0則說明這個候選人是jyy自己看上的。為了保證團隊的和諧,jyy需要保證,
如果招募了候選人i,那麼候選人ri」也一定需要在團隊中。當然了,jyy自己總是在團隊裡的。每乙個候選人都有
乙個戰鬥值pi」,也有乙個招募費用si」。jyy希望招募k個候選人(jyy自己不算),組成乙個價效比最高的團隊。
也就是,這k個被jyy選擇的候選人的總戰鬥值與總招募總費用的比值最大。
input
輸入一行包含兩個正整數k和n。
接下來n行,其中第i行包含3個整數si,pi,ri表示候選人i的招募費用,戰鬥值和推薦人編號。
對於100%的資料滿足1≤k≤n≤2500,0< 」 si,pi」≤10^4,0≤ri< i
output
輸出一行乙個實數,表示最佳比值。答案保留三位小數。
sample input
1 21000 1 0
1 1000 1
sample output
0.001
hint
2017.9.12新加資料一組 by gxzlegend
source
分數規劃+dfs序 揹包 常數大 差點被卡t
二分答案 然後結果就是sigma p[x]-s[x]*mid
設dp[i][j]表示i子樹選了j個點的最大代價
具體可上網搜尋 依賴型揹包
只要看選k個能否》0即可
#include
#include
#include
#include
#include
#define eps 1e-9
using
namespace
std;
inline
char gc()
return *s++;
}inline
int read()
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}const
int n=2550;
struct nodedata[n<<1];
double dp[n][n],mid;int num,h[n],k,n,s[n],p[n];
inline
void insert1(int x,int y)
inline
void dfs(int x,int fa)
for (int i=1;i<=k;++i) dp[fa][i]=max(dp[fa][i],dp[x][i]);
}inline
bool check(double md)
int main()
double l=0,r=2e7;
while(fabs(r-l)>eps)printf("%.3f\n",r);
return
0;}
bzoj4753 Jsoi2016 最佳團體
在萌神的指點下學會了這道題。先01分數規劃,二分答案,s p a ns 即 s p an s 0 那就重新計算點權wi si mid pi,轉成判定性問題 能否選擇一些點,使得總點權不小於0?傳統的泛化揹包或者多叉轉二叉是o n3 的。ac cord ingt oftm 2001 萌神 dfs之後,...
bzoj4753 最佳團體
jsoi 資訊學代表隊一共有 nn 名候選人,這些候選人從 11 到 nn 編號。方便起見,jyy 的編號是 00 號。每個候選人都由一位編號比他小的候選人r iri 推薦。如果 r i 0ri 0 則說明這個候選人是 jyy 自己看上的。為了保證團隊的和諧,jyy 需要保證,如果招募了候選人 ii...
bzoj 4753 最佳團體
written with stackedit.jsoi 資訊學代表隊一共有n名候選人,這些候選人從 1 到 n 編號。方便起見,jyy 的編號是 0 號。每個候選人都由一位編號比他小的候選人 r i 推薦。如果 r i 0 則說明這個候選人是 jyy 自己看上的。為了保證團隊的和諧,jyy 需要保證...