B - 小Y上学记——小Y的玩偶

Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)

Problem Description

小Y最喜欢拆拆拆了~尽管他不一定能装回去。

小Y有一个很可爱的积木玩偶,是由一块一块积木拼接而成,现在小Y想把这个积木玩偶拆拆拆。

每一块积木玩偶都有一个耐久值,想把一块积木拆出来,小Y需要付出的能量就是和它直接拼接的所有积木的耐久值之和。

小Y很懒的~他想知道把这个玩偶全部拆好,最少需要付出多少能量?

Input

多组数据,每组数据首先是一个整数n表示积木块数。(0<n<=1000)

接下来一行包含n个整数,表示每块积木的耐久值a[i](0<=a[i]<=100000)。

接下来是n行,第i行代表第i块积木的连接情况。

每一行首先是一个整数k,表示这块积木与k块积木相连,接下来是k个整数,代表与这块积木相连的积木标号(标号从0开始)

保证连接情况合法。

Output

对于每组数据,输出一个整数,表示小Y需要的最少能量。

Sample Input

  1. 4
  2. 10 20 30 40
  3. 2 1 3
  4. 2 0 2
  5. 1 1
  6. 1 0
  7. 4
  8. 100 100 100 100
  9. 1 1
  10. 3 0 2 3
  11. 2 1 3
  12. 2 1 2
  13. 7
  14. 40 10 20 10 20 80 40
  15. 4 2 3 4 5
  16. 1 4
  17. 2 0 3
  18. 5 0 2 4 5 6
  19. 4 0 1 3 6
  20. 2 0 3
  21. 2 3 4

Sample Output

  1. 40
  2. 400
  3. 160

Hint

对于第一组数据,首先拆掉第2块积木,需要20能量,然后拆掉第1块积木,需要10能量,接着拆掉第3块积木,需要10能量,最后只剩下第0块了,不需要能量了。总共需要40点能量。

对于第二组数据,无论怎么拆除,都是需要400点能量。

解法:贪心+邻接表(矩阵也可以)

  每次拿走耐久度最大的点,更新图,在重复拿走,直到都成为独立的点即可。

  为何要拿走耐久度最大的点,假如这个点的耐久度为K,有m条边,每一条边的所连接的点的耐久度为Ki,如果不拿走这个点的话,需要拆了可连接他的m条边的点,则是需要消耗K*m能量,如果直接把这个点拆除了,则只是需要K1+K2+...+Km能量。

因为,K*m>=K1+K2+...+Km,,细分下来,可以知道,每次拆除耐久度最大的点可以保证消耗的能量最小。再去更新连接图即可。

代码:2015.7.31

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #define MAX 100010
  6. using namespace std;
  7. int First[MAX];
  8. int SIGN;
  9. struct edge{int TO,Next,Vlaue;}ID[*MAX];
  10. struct Node{int ID,V;}Poi[MAX];
  11. int cmp(Node a,Node b){return a.V>b.V;};
  12. void Add_E(int x,int y,int z)
  13. {
  14. ID[SIGN].TO=y;
  15. ID[SIGN].Vlaue=z;
  16. ID[SIGN].Next=First[x];
  17. First[x]=SIGN++;
  18. }
  19. void Add_E(int x,int y)
  20. {
  21. ID[SIGN].TO=y;
  22. ID[SIGN].Next=First[x];
  23. First[x]=SIGN++;
  24. }
  25. void Dele_x_y(int x,int y)/*删除x-y的边*/
  26. {
  27. int i,j;/*起始点要注意*/
  28. for(i=j=First[x];i!=;j=i,i=ID[i].Next)
  29. {
  30. if(ID[i].TO==y)/*如果能够找到该边*/
  31. {
  32. if(i==j)First[x]=ID[i].Next;
  33. ID[j].Next=ID[i].Next;
  34. break;
  35. }
  36. }
  37. return ;
  38. }
  39. int GET_Sum(int x)/*查找与X相连的顶点*/
  40. {
  41. int i,Sum=;
  42. for(i=First[x];i!=;i=ID[i].Next) //查找与该点相关的点
  43. {
  44. Sum+=ID[i].Vlaue;
  45. Dele_x_y(ID[i].TO,x);
  46. }
  47. return Sum;
  48. }
  49.  
  50. int main()
  51. {
  52. int N,M,K,i,j,k;
  53. int x,y,z,Sum;
  54. int NUM[MAX];
  55. while(scanf("%d",&N)!=EOF)
  56. {
  57. SIGN=;
  58. for(i=;i<=N;i++)
  59. {
  60. scanf("%d",&NUM[i]);
  61. Poi[i].ID=i;
  62. Poi[i].V=NUM[i];
  63. First[i]=;
  64. }
  65. sort(Poi+,Poi+N+,cmp);
  66. for(i=;i<=N;i++)
  67. {
  68. scanf("%d",&K);
  69. while(K--)
  70. {
  71. scanf("%d",&M);M+=;
  72. Add_E(i,M,NUM[M]);
  73. }
  74. }
  75. Sum=;
  76. for(i=;i<=N;i++)
  77. {
  78. Sum+=GET_Sum(Poi[i].ID);
  79. }
  80. printf("%d\n",Sum);
  81. }
  82. return ;
  83. }

B - 小Y上学记——小Y的玩偶的更多相关文章

  1. D - 小Y上学记——要迟到了!

    D - 小Y上学记——要迟到了! Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  2. C - 小Y上学记——认识新同学

    C - 小Y上学记——认识新同学 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  3. A - 小Y上学记——修学分

    A - 小Y上学记——修学分 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) S ...

  4. 【小知识】比较 x^y 和 y^x 的大小

    往前翻几个编号相邻的题目翻到了这么一道题,感觉很好奇就做了一下 (upd:我下午问了下出题人做法,他就把题隐藏了……这不太友好啊……所以我补一下题意:) 题意 给你两个整数 $x$ 和 $y$,求 $ ...

  5. [再寄小读者之数学篇](2014-11-19 $\sin(x+y)=\sin x\cos y+\cos x\sin y$)

    $$\bex \sin(x+y)=\sin x\cos y+\cos x\sin y. \eex$$ Ref. [Proof Without Words: Sine Sum Identity, The ...

  6. CCF CSP 201812-1 小明上学

    题目链接:http://118.190.20.162/view.page?gpid=T80 问题描述 试题编号: 201812-1 试题名称: 小明上学 时间限制: 1.0s 内存限制: 512.0M ...

  7. 201812-1 小明上学 Java

    思路: 上学这个题和放学有区别,上学是小明每到一个路口的情况,是实时更新的.不是只有出发时间,那样就比较复杂了. 这个题需要注意:黄灯之后要等红灯,想一下交通规则. import java.util. ...

  8. CCF201812-1小明上学

    题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间.他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿 ...

  9. 小圣求职记A:腾讯篇

    本人普通985高校计算机专业研究生一枚,从9月12号开始正式找工作,一个月过去了,参加了能参加的各个互联网公司的宣讲.笔试.面试,现用两篇随笔分享所见所闻.随笔A将以腾讯为例详细展示整个过程,随笔B将 ...

随机推荐

  1. ora2pg数据迁移

    1.安装strawberry-perl-5.242.安装ora2pg-17.4 #perl Makefile.PL #dmake && dmake install3.安装ora2pg相 ...

  2. Java:注解(Annotation)自定义注解入门

    转载地址:http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的 ...

  3. IBM Minus One

    IBM Minus One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  4. 【卷二】网络二—TCP服务器与客户端

    经过上回简单地介绍,大家对服务器多少应该清楚一些了吧!还记得TCP: (Transmission Control Protocol) 传输控制协议? 还记得IP: (Internet Protocol ...

  5. 干货篇:揭开CSS盒模型神秘的面纱

    写博客可以对学习内容进行总结.分享和交流(面对面的技术分享会也不错)... 如果是单纯的记录,印象笔记完全够了. 步入正题,盒模型是web布局核心,掌握基础知识,以后实战中会如鱼得水~ 概念与历史 C ...

  6. 一箭N雕:多任务深度学习实战

    1.多任务学习导引 多任务学习是机器学习中的一个分支,按1997年综述论文Multi-task Learning一文的定义:Multitask Learning (MTL) is an inducti ...

  7. 负载均衡lvs_dr_tcp_http单调度

    准备三台虚拟,均为CentOS6.5 x86_64注意,配置过程中,保持端口的一致性.director (eth0 192.168.1.189, vip eth0:0: 192.168.1.18) D ...

  8. IE8下 Select文字垂直居中的办法

    .select { padding: 4px 0; height: 30px; line-height: 26px; vertical-align: middle;} 处理前: 处理后:

  9. qt5.6 for android

    尝试在qt下写android的程序.测试,没有编译成功. 在选项-android配置页面,提示有"Qt version for 3 architectures are missing&quo ...

  10. JAVA语法基础(课堂ppt问题总结)

    一:运行源代码EnumTest.java,分析运行结果. 代码如下: public class EnumTest { public static void main(String[] args) { ...