题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1055

题意:给一棵树涂色,这棵树的每个节点都有自己的价值Ci,涂色的原则是只由这个节点的父节点涂色之后才能涂色(就是从根节点开始涂色)。

每次涂色用时1s,每个节点的涂色花费是Ci*Fi(Fi是从最开始到涂色到这个节点所花的时间)。对这棵树涂色的总涂色花费为sum,

求怎样涂色才能使sum最小。

思路:

结论:对于一个非根节点,它具有最大的权值,只有先访问完它的父节点再访问它才能使总花费最小。

1、建立一个结构体,c表示节点价值,fa表示父节点,t表示耗时,ans为总花费,初始化为sum(ci),表示每个节点自己涂色。

2、找到最大的非根节点m,然后找到它的父节点p,将m与p合并。ans+=vc[m].c*vc[p].t,表示从m到p这段路上的代价,然后

vc[p].c+=vc[m].c; vc[p].t+=vc[m].t; vc[p].w=1.0*vc[p].c/vc[p].t;

3、重复n-1次,因为有n个节点,n-1后合并为1个节点。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct Node{
int fa,c,t;
double w;
};
Node vc[];
int fd(int n,int r)
{
int i,j,p;
double mx=-1.0;
for(i=;i<=n;i++)
{
if(i!=r&&vc[i].w>mx)
{
mx=vc[i].w;
p=i;
}
}
return p;
} int main(void)
{
int n,r,i,j,ans,p,m,x,y;
while(~scanf("%d %d",&n,&r))
{
if(n==&&r==) break;
ans=;
for(i=;i<=n;i++)
{
scanf("%d",&vc[i].c);
vc[i].t=;
vc[i].w=vc[i].c;
ans+=vc[i].c;
}
for(i=;i<n;i++)
{
scanf("%d %d",&x,&y);
vc[y].fa=x;
}
for(i=;i<n;i++)
{
m=fd(n,r);
p=vc[m].fa;
vc[m].w=;
ans+=vc[m].c*vc[p].t;
for(j=;j<=n;j++)
if(vc[j].fa==m) vc[j].fa=p;
vc[p].c+=vc[m].c;
vc[p].t+=vc[m].t;
vc[p].w=1.0*vc[p].c/vc[p].t;
}
printf("%d\n",ans);
}
return ;
}

hdu-1055(贪心)的更多相关文章

  1. Hdu 5289-Assignment 贪心,ST表

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...

  2. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

  3. hdu 1735(贪心) 统计字数

    戳我穿越:http://acm.hdu.edu.cn/showproblem.php?pid=1735 对于贪心,二分,枚举等基础一定要掌握的很牢,要一步一个脚印走踏实 这是道贪心的题目,要有贪心的意 ...

  4. hdu 4974 贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=4974 n个人进行选秀,有一个人做裁判,每次有两人进行对决,裁判可以选择为两人打分,可以同时加上1分,或者单独为一 ...

  5. hdu 4982 贪心构造序列

    http://acm.hdu.edu.cn/showproblem.php?pid=4982 给定n和k,求一个包含k个不相同正整数的集合,要求元素之和为n,并且其中k-1的元素的和为完全平方数 枚举 ...

  6. HDU 2307 贪心之活动安排问题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2037 今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)  ...

  7. HDU 1052 贪心+dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS ...

  8. HDU 2111 Saving HDU【贪心】

    解题思路:排序后贪心,和fatmouse's  trade 类似 Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: ...

  9. HDU 2831 (贪心)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2831 题目大意:植物大战僵尸.给定种植植物时间间隔t,以及每个僵尸的到达时间v,生命d.问是否能赢. ...

  10. HDU 3090 (贪心)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3090 题目大意:一共n段路.每段路每千米都会被抢劫一定数量,可以雇佣武士护卫m千米.问最少被抢劫数量 ...

随机推荐

  1. 某C电面记

    昨天突然接到某C的电话面试,有点措不及防.15分钟左右的电面后,直接收到了不合适的邮件通知,那个惨~~~~~~~~~~~~~~~ 记录回答得不是很好的几个问题: 1.自动化层面,你做了什么工作,给团队 ...

  2. 客户端如何连接 DataSnap Server 调用服务的方法

    一般http访问的地址是 http://localhost:8099/datasnap/rest/TServerMethods1/EchoString/abc 一.用FDConnection1连接Da ...

  3. sendkeys

    1)为了指定单一键盘字符,必须按字符本身的键.例如,为了表示字母 A,可以用 "A" 作为 string.为了表示多个字符,就必须在字符后面直接加上另一个字符.例如,要表示 A.B ...

  4. android MD5 SHA1

    参考文章: AndroidStudio 中怎样查看获取MD5和SHA1值(应用签名)(https://www.cnblogs.com/zhchoutai/p/7102516.html) 使用 java ...

  5. tensorflow笔记之学习率设置

    在使用梯度下降最小化损失函数时,如果学习率过大会导致问题不能收敛到最优解,学习率过小,虽然可以收敛到最优解,但是需要的迭代次数会大大增加,在Tensorflow中,可以用指数衰减法设置学习率,tf.t ...

  6. ServiceLoader实现原理

    在java中根据一个子类获取其父类或接口信息非常方便,但是根据一个接口获取该接口的所有实现类却没那么容易. 有一种比较笨的办法就是扫描classpath所有的class与jar包中的class,然后用 ...

  7. jstatd - Virtual Machine jstat Daemon

    jstatd [options] 参数:options 命令行参数,可以按任何顺序,但如果有多余的或者中有互斥的参数,最后制定的那个参数将有优先权 options: -nr 当一个存在的RMI Reg ...

  8. iKcamp新书上市《Koa与Node.js开发实战》

    内容摘要 Node.js 10已经进入LTS时代!其应用场景已经从脚手架.辅助前端开发(如SSR.PWA等)扩展到API中间层.代理层及专业的后端开发.Node.js在企业Web开发领域也日渐成熟,无 ...

  9. 输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题

    题目的大致意思如下: 输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度: 例如: 输入:6  0 1  0 2  1 3  1 4  2 5 ...

  10. blat

    1)  产生背景---------------------------------------------------2002年的时候,随着人类基因组项目不断推进,需要将大量ESTs(300万) 及m ...