zoukankan      html  css  js  c++  java
  • 【普及组_在线赛】班级聚会(reuntion)

    题目描述
    毕业20年以后,我们的主人公开始准备同学聚会。打了无数电话后他终于搞到了所有同学的地址。他们有些人仍在本市,但大多数人分散在其他的城市。不过,他发现一个巧合,所有地址都恰好分散在一条铁路线上。他准备发出邀请但无法决定应该在哪个地方举行宴会。最后他决定选择一个地点,使大家旅行的总花费最小。我们的主人公既不擅长数学,也不擅长计算机。他请你这个NOIP的高手帮忙写一个程序,根据他同学的地址,选择聚会的最佳地点。

    输入
    输入文件的每一行描述了一个城市的信息。(不超过10000个城市),首先是城里同学的个数(保证总人数在2^32范围内),紧跟着是这个城市到Moscow(起始点)的距离(km),最后是城市的名称。最后一行描述的总是Moscow,它在铁路线的一端,距离为0,三个数据之间分别用空格隔开。

    输出
    输出聚会地点城市名称和旅程费用(单程),两者之间用一个空格隔开。每km花费1元人民币。总距离保证在2^64范围内。

    样例输入
    7 9289 Vladivostok
    5 8523 chabarovsk
    3 5184 Irkutsk
    8 2213 Yalutorovsk
    10 0 Moscow

    样例输出
    Yalutorovsk 112125

    思路:

    我看到很多人用的是O(n2)的暴力做,可这是加强版的题,n2看上去过不了(可实际上数据太水,可以卡过)。

    法1:

    枚举每个城市,然后在每个城市枚举别的城市,记录和,维护最小值,就OK了。
    O(n2)。

    法2:

    这种方法属于一种dp的方式,因为我可以利用原点的值,进而推出下一个城市的值。
    我们设num[i],km[i],name[i],表示城市i的人数,距离和名字。(注意,这个算法要保证km数组要有序,所以我们要以km为关键字排序)。
    qzh[i]表示0号城市到i号的前缀和。
    然后,我们想,从一个点到另一个点是有一边增加,有一边减少,这样转移方程就看得出来了:

    f=f1+(qzh[i]-qzh[j])*(abs(km[j]-km[j+1]))-qzh[j]*(abs(km[j]-km[j+1]));
    

    O(n)。

  • 相关阅读:
    java匿名对象
    Java面向对象详解
    Java语言基本语法
    Win7下JDK环境变量的设置
    LeetCode-Shortest Word Distance
    LeetCode-Count Complete Tree Nodes
    LeetCode-Palindrome Pairs
    LeetCode- Implement Trie (Prefix Tree)
    LeetCode-Lowest Common Ancestor of a Binary Tre
    LeetCode- Binary Tree Longest Consecutive Sequence
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13159877.html
Copyright © 2011-2022 走看看