微软2017年预科生计划在线编程笔试第二场 EL SUENO

树上背包。

简单的树形$dp$,计算出摧毁每一个节点所需的最小费用,背包即可。

#include<bits/stdc++.h>
using namespace std;

struct X
{
    int fa;
    int in;
    int ip;
    int c;
}s[2010];

int dp[2010][20010];
int cost[2010];
int f[20010];

vector<int>g[2010];
int n,root,ans;

void dfs(int x)
{
    if(g[x].size()==0)
    {
        cost[x]=s[x].c;
        return ;
    }

    for(int i=0;i<g[x].size();i++)
    {
        int to=g[x][i];
        dfs(to);
    }
    for(int j=1;j<=s[x].in;j++) f[j]=dp[x][j]=0x7FFFFFFF;

    for(int i=0;i<g[x].size();i++)
    {
        int A = cost[g[x][i]],B = s[g[x][i]].ip;
        if(A==0x7FFFFFFF) continue;

        for(int j=1;j<=s[x].in;j++) f[j]=0x7FFFFFFF;
        for(int j=0;j<=s[x].in;j++)
        {
            if(dp[x][j]==0x7FFFFFFF) continue;
            f[min(s[x].in,j+B)] = min(f[min(s[x].in,j+B)],dp[x][j] + A);
        }
        for(int j=0;j<=s[x].in;j++) dp[x][j] = min(dp[x][j],f[j]);
    }
    cost[x] = dp[x][s[x].in];
    if(cost[x]!=0x7FFFFFFF) cost[x] = cost[x] + s[x].c;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&s[i].fa,&s[i].in,&s[i].ip,&s[i].c);
        if(s[i].fa==0) root=i;
        g[s[i].fa].push_back(i);
    }

    ans=0x7FFFFFFF;
    dfs(root);
    ans=cost[root];

    if(ans!=0x7FFFFFFF) printf("%d\n",ans);
    else printf("-1\n");

    return 0;
}
时间: 2024-10-05 17:10:46

微软2017年预科生计划在线编程笔试第二场 EL SUENO的相关文章

微软2017年预科生计划在线编程笔试第二场 Queen Attack

排序. 分别按照$x$,$y$以及对角线排序,统计一下方案数就可以了. #include<bits/stdc++.h> using namespace std; int n; struct X { int x,y; }s[100010]; bool cmp1(X a, X b) { return a.x<b.x; } bool cmp2(X a, X b) { return a.y<b.y; } bool cmp3(X a, X b) { return a.x+a.y<b.x

微软2017年预科生计划在线编程笔试第二场 Diligent Robots

模拟. 不断分裂,然后计算时间,取个最小值.我也不知道这做法对不对的,读完题猜了一下,抱着$WA$的心态$submit$了,然后跳出一个$AC$. #include<bits/stdc++.h> using namespace std; long long n; int q; int main() { scanf("%lld%d",&n,&q); long long now=1; long long ans=n; long long ci=0; while(

微软2017年预科生计划在线编程笔试

Legendary Items 答案是每一件物品需要的期望步数和 1 #include <bits/stdc++.h> 2 #define ll long long 3 #define ull unsigned long long 4 #define st first 5 #define nd second 6 #define pii pair<int, int> 7 #define pil pair<int, ll> 8 #define pli pair<ll,

hihocoder1489 Legendary Items (微软2017年预科生计划在线编程笔试)

http://hihocoder.com/problemset/problem/1489 笔试题第一道,虽然说第一道都很水,但是我感觉这题不算特别水把..这道题我就卡住了我记得,tle,最后只有30分,比较惨烈.我个人感觉这道题正解比较难想把,那时候太年轻,没有想到当item很大时,可以从第八道item开始就把初始p当成0来计算..不过我试了一下,发现即使如此,还要计算每次的数学期望,反正我当时要是不知道,Ei和Ei+1之间的联系,应该还是算不出来..我太麻瓜了.. 贴一下我tle代码,思路就是

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子

2017美团点评web前端在线编程题(1)(2)

题1: 题目描述: 很多网页上会显示一些其他网页的超链接,如一些搜索网页会逐条列出搜索到的条目.在一些网页中,被用户点击过的超链接会换一种颜色. 假设某网页一开始有n条超链接,从上到下有1-n编号,每条超链接都显示成一个字符串,最开始所有的超链接都显示为蓝色.现在给出用户点击过得那些超链接, 一条超链接只要被点击过了,就会由蓝色变成紫色,请输出最后所有的仍未蓝色的超链接. 输入: 第一行输入一个整数n,接下来n行,每行一个字符串,表示每个超链接的名称,名称只有小写字母构成,长度不超过20,且所有

在线编程笔试练习2(京东)

时间限制:1秒 空间限制:32768K 热度指数:9801 题目描述 给你两个集合,要求{A} + {B}. 注:同一个集合中不会有两个相同的元素. 输入描述: 每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超过int范围的整数,每个元素之间有个空格隔开. 输出描述: 针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格. 示例1 输入 3

微软2016校招笔试 第二场部分题目个人思路

A. Lucky Substrings 这道题并不难,由于字符串长度只有100,那么它的子串肯定不超过1w个,枚举出所有字串都是没有问题的,至于检验一个子串里面不同的字母数量是不是斐波那契数,我们只需要事先把斐波那契数列小于1w的项都生成出来,然后枚举一个子串之后,统计出不同字母的数量(边找边统计,如果当前字母之前出现过就不加,如果没出现过就记住并+1),去这个里面找就行了.斐波那契数列推不了几项就到1w了-- 最后要字典序从小到大排列,并且还要去重,那就用string然后直接sort+uniq

Open XML SDK 在线编程黑客松

2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的程序猿们提供一个在线动手开发,学习交流,技术分享,发挥创意与竞技的盛宴. 我们为参赛队伍准备了丰富的技术干货,国内外高手无私分享以及技术支持,逐步引导的在线学习视频教程与技术文档,场景范例,在线编程及演示环境,社区互动,丰富礼品(如极客学院特别为每位参赛人员提供月VIP码,用户可以免费学习极客学院全网课程)及