嘟嘟嘟
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 #include11view codeusing
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 }
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自己總...