思路:dp[i]表示讓上司i簽字至少需要多少工人簽字。
轉(zhuǎn)移方程:將i的所有節(jié)點(diǎn)根據(jù)所需工人數(shù)量升序排序,設(shè)i需要k個(gè)下屬簽字,dp[i] = sum{dp[v]| 0 <= v <k}
AC代碼:
#include<cstdio>#include<algorithm>#include<cstring>#include<utility>#include<string>#include<iostream>#include<map>#include<set>#include<vector>#include<queue>#include<stack>using namespace std;#define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> const int maxn = 1e5 + 5;vector<int>son[maxn];int t;int dfs(int u) { int n = son[u].size(); if(!n) return 1; //工人 vector<int>cnt; for(int i = 0; i < n; ++i) { int v = son[u][i]; cnt.push_back(dfs(v)); } sort(cnt.begin(), cnt.end()); int c = (n*t - 1) / 100 + 1; int ans = 0; for(int i = 0; i < c; ++i) ans += cnt[i]; return ans;}int main() { int n; while(scanf("%d%d", &n, &t) == 2 && n) { for(int i = 0; i <= n; ++i) son[i].clear(); int PRe; for(int i = 1; i <= n; ++i) { scanf("%d", &pre); son[pre].push_back(i); } printf("%d/n", dfs(0)); } return 0;}如有不當(dāng)之處歡迎指出!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注