BZOJ 4027 贪心

如果要删除某一个节点,那么对父亲的影响就是c[x]+child[x]。而且优先选影响小的点删除更优,而且能删就删,因为如果能删却没删,回到父亲节点后不会有更优的删点方法使影响更小。

第一次用C4Droid的代码格式化。。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define rep(i,j,k) for(i=j;i<k;i++)
const int N = 2000005;
int m, ans, c[N];
vector < int >g[N];
bool cmp(int a, int b)
{
    return c[a] < c[b];
}

void dfs(int x)
{
    int i;
    rep(i, 0, g[x].size())dfs(g[x][i]);
    sort(g[x].begin(), g[x].end(), cmp);
    c[x] += g[x].size();
    rep(i, 0, g[x].size())
    {
        int t = c[g[x][i]];
        if (c[x] + t - 1 <= m)
            c[x] += t - 1, ++ans;
        else
            break;
    }
}

int main()
{
    int n, i, j, y;
    scanf("%d%d", &n, &m);
    rep(i, 0, n) scanf("%d", &c[i]);
    rep(i, 0, n)
    {
        scanf("%d", &j);
        while (j--)
        {
            scanf("%d", &y);
            g[i].push_back(y);
        }
    }
    dfs(0);
    printf("%d", ans);
    return 0;
}

你可能感兴趣的:(贪心,bzoj)