zoukankan      html  css  js  c++  java
  • Travel

    Description
    Yicou经常旅游,但很可惜他不太喜欢旅游(人在江湖,身不由己阿~)所以,每次yicou到了一个景点以后,就会通过景点地图,寻找最少时间走出景区的路线。
    这天,yicou一群人,在FJ的带领下去旅游,不过yicou并不关心去的是哪里,他只想着赶快走出去回去编程。在拿到地图的时候,他惊奇的发现。整个景区竟然是一颗高度为h完全二叉树!最后一行的叶结点全都连接着出口!而入口正好连接着是树根。每个点都只能走向其两个子结点。并且这张地图很好的标出了,每个景点观光时间(从0到99)(路程时间忽略不计)。现在,yicou需要你帮助他寻找从入口到某一出口的最短时间。
    不过,在你算完最短时间以后,突然发现,那是一张过期的地图!由于小鱼儿和花无缺的移花接木的影响,很多景点的观光时间变了…(假冒伪略害人不浅阿~)之后你又在小卖部买到了后面一次的更新数据。刚算完新的最短时间,哈哈~,发现还不是最新的,又买了一次更新…一直买了m次,才全都是最新的,而这最后一次算出的才是yicou想要的时间。
    不过,你为了向yicou说明,你为了帮他付出了很多努力,yicou需要请你吃饭!你需要把过程中算得的那m次不算数的最短时间,和最后一次算数的最短时间,都给yicou看。
    举例:
    1
    2 5
    3 4 6 7
    最短为1-2-3 为6

    后来第3行第1个数据变为10
    1
    2 5
    10 4 6 7
    最短为1-2-4 为7

    后来第3行第2个数据变为10
    1
    2 5
    10 10 6 7
    最短为1-5-6 为12


    再后来第2行第2个数据变为6
    1
    2 6
    10 10 6 7
    最短为1-6-6 为13


    Input
    There are many tests, but only one case in each test.
    The first line contain a number h (1<= h <= 16) 代表完全二叉树的高度
    Next h lines, each has 2^i (0<=i Next line contain a number m (0<= m <= 10000) 代表更新次数
    Next m lines each contains i, j, k means: the ith line’s jth data changes to k
    数据准保合乎出题规范,不用判错。


    Output
    m+1 lines each means a min time

    Sample Input

    3
    1
    2 5
    3 4 6 7
    3
    3 1 10
    3 2 10
    2 2 6


    Sample Output

    6
    7
    12
    13

    View Code
     1 #include <stdio.h>
    2 #include<math.h>
    3 #include<string.h>
    4 #define min(a,b) (((a) < (b)) ? (a) : (b))
    5 #define mx (1024*64+2)
    6 int a[mx],l;
    7 int f[mx];
    8 int fan(int i)
    9 {
    10 if (i>=l)
    11 return a[i];
    12 else if(f[i]!=-1)
    13 return f[i];
    14 else
    15 return f[i]=min(fan(2*i),fan(2*i+1))+a[i];
    16 }
    17 int main()
    18 {
    19 int n,i,j;
    20 int m,x,y,num,c;
    21 scanf("%d",&n);
    22 num=pow(2,n);
    23 for(i=1;i<num;i++) scanf("%d",&a[i]);
    24 memset(f,-1,sizeof(f));
    25 l=pow(2,n-1);
    26 for(i=l;i<num;i++) f[i]=a[i];
    27 printf("%d\n",fan(1));
    28 scanf("%d",&m);
    29 for(i=0;i<m;i++)
    30 {
    31 scanf("%d%d%d",&x,&y,&c);
    32 n=pow(2,x-1)+y-1;
    33 f[n]+=c-a[n];
    34 a[n]=c;
    35 if(n>=l) f[n]=a[n];
    36 n=n/2;
    37 while( n>=1 && f[n]!=min(f[2*n],f[2*n+1])+a[n] )
    38 {
    39 f[n]=min(f[2*n],f[2*n+1])+a[n];
    40 n=n/2;
    41 }
    42 printf("%d\n",f[1]);
    43 }
    44
    45 return 0;
    46 }


  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2378502.html
Copyright © 2011-2022 走看看