JSOI2016 最佳團體

2022-05-09 13:12:07 字數 1729 閱讀 5914

嘟嘟嘟

01分數規劃+樹形揹包。

然後就沒了。

結果我調了半天,原因還是樹形揹包不熟練。

我是用dfs序求的,轉化的時候,是dp[i][j]轉化到dp[i + 1][j + 1]或dp[i +siz[pos[i]]][j],而不是像普通的dp從別的狀態轉化到dp[i][j],所以最後的答案應該考慮到dp[n + 1][m + 1],而不是只到n,而且初始化的時候也要到n + 1這一層。這也就是我為啥總wa第3個點。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const db inf =1e12;

19const db eps = 1e-5;20

const

int maxn = 2505;21

inline ll read()

2226

while(isdigit(ch))

27if(last == '

-') ans = -ans;

28return

ans;29}

30 inline void

write(ll x)

3136

37int

k, n, s[maxn], p[maxn];

38struct

edge

39e[maxn];

42int head[maxn], ecnt = -1;43

void addedge(int x, int

y)44

;46 head[x] =ecnt;47}

4849

int dfsx[maxn], pos[maxn], cnt = 0;50

intsiz[maxn];

51void dfs(int

now)

5260}61

db dp[maxn][maxn], w[maxn];

62 db calc(int

i, db x)

6366

bool

judge(db x)

6778 db ans = -inf;

79for(int i = 1; i <= cnt + 1; ++i) ans = max(ans, dp[i][k + 1

]);80

return ans > -eps;81}

8283

intmain()

8493 dfs(0

);94 db l = 0, r =1e4;

95while(r - l >eps)

96101 printf("

%.3lf\n

", l);

102return0;

103 }

view code

JSOI 2016 最佳團體

有 n n 名候選人,從 1 role presentation 11到 n n 編號,有乙個隊長的編號為 0 role presentation 0 0,每個候選人都由一位編號比他小的候選人推薦 如果為 0 0 則表示是隊長推薦的 隊長希望招募 k role presentation k k個人,...

JSOI2016 最佳團體

題面 給定一棵樹,每個點有代價和價值,現在求乙個點集,使得點集中每個點的祖先也都在點集中,且點集中所有點的價值和 代價和最大。題解價值和 代價和最大 過於明顯的01分數規劃,直接把a mid j作為點權跑樹形dp,然後看f r oot 1 f root 1 f root 1 是否大於0即可。據說這題...

JSOI2016 最佳團體

jsoi資訊學代表隊一共有n名候選人,這些候選人從1到n編號 方便起見,jyy的編號是0號。每個候選人都由一位編號比他小的候選人ri推薦 如果ri 0 則說明這個候選人是jyy自己看上的 為了保證團隊的和諧,jyy 需要保證,如果招募了候選人i,那麼候選人r 也一定需要在團隊中。當然了,jyy自己總...