uva 12186 工人的请愿书

来源:互联网 发布:如何评价余秋雨知乎 编辑:程序博客网 时间:2024/04/29 05:32

d[u]表示让u给上级发信至少需要多少人,假设u有k个子节点,则至少需要c = (k*T-1)/ 100 + 1个人才行,然后按照子节点d的值从小到大排序,把前c个相加就是d[u]。

/*********************************************** * Author: fisty * Created Time: 2015/2/27 17:02:07 * File Name   : uva12186.cpp *********************************************** */#include <iostream>#include <cstring>#include <deque>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <vector>#include <cstdio>#include <bitset>#include <algorithm>using namespace std;#define Debug(x) cout << #x << " " << x <<endl#define Memset(x, a) memset(x, a, sizeof(x))const int INF = 0x3f3f3f3f;typedef long long LL;typedef pair<int, int> P;#define FOR(i, a, b) for(int i = a;i < b; i++)#define MAX_N 100010int n, T;vector<int> son[MAX_N];int dp(int u){    if(son[u].empty()) return 1;    int k = son[u].size();    vector<int> d;    for(int i = 0;i < k; i++){        d.push_back(dp(son[u][i]));    }    sort(d.begin(), d.end());    int c = (k * T - 1) / 100 + 1;    int ans = 0;    for(int i = 0;i < c; i++)        ans += d[i];    return ans;}int main(){    //freopen("in.cpp", "r", stdin);    cin.tie(0);    ios::sync_with_stdio(false);    while(cin >> n >> T){        if(!n && !T) break;        FOR(i, 0, n+1) son[i].clear();        FOR(i, 1, n+1){            int u;            cin >> u;            son[u].push_back(i);        }        cout << dp(0) << endl;    }    return 0;}


0 0