【普及组_在线赛】班级聚会(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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值