题目链接: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. Centos LVM 创建 删除 扩大 缩小

    新建LVM的过程1.使用fdisk 新建分区 修改ID为8e3.使用 pvcreate 创建 PV 4.使用 vgcreate 创建 VG 5.使用 lvcreate 创建 LV 6.格式化LV7.挂 ...

  2. zookeeper的配置参数详解(zoo.cfg)

    配置参数详解(主要是%ZOOKEEPER_HOME%/conf/zoo.cfg文件) 参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. data ...

  3. SecureCRT结合xmanager远程启动图形化界面程序

    我们很多操作都是可以通过命令行的形式来完成,但是由于不支持图形模式,在一些需要图形界面的时候就很麻烦.本次设置可以在secureCRT中直接使用netca\dbca命令,通过xmanager的pass ...

  4. MySql DATE_FORMAT函数用法

    DATE_FORMAT(date, format) 函数用法 DATE_FORMAT(date, format) 函数根据format字符串格式化date值. 1.把字符串转为日期格式 实例: SEL ...

  5. Filter接口编写过滤器

      Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息 ...

  6. Android中app卡顿原因分析示例

    在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. =========== ...

  7. like模糊查询

    1. ${}获取值,直接连接 name like '%${search_content}%' 2.CONCAT()函数 MySQL的 CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的m ...

  8. Android模拟器内安装应用

    一.通过apk安装器安装应用 1.下载apk安装器(网上随便搜一个就可以) 2.下载要测试的应用的apk,我这里下载的是微信的apk 3.打开apk安装器,点击右上角的Devices选择要安装到的设备 ...

  9. spring JPA分页排序条件查询

    @RequestMapping("/listByPage") public Page<Production> listByPage(int page, int size ...

  10. eclipise快捷键,留给以后备用

    快捷键无效解决办法: 1.考虑是否被其他应用占用,如QQ,QQ音乐,千千动听等 2.在eclispe查看是否被修改:Window->Preferences->General->Key ...