毕业20年以后我们的主人公开始准备同学聚会。打了无数电话后他终于搞到了所有同学的地址他们有些人仍在本市,但大多数人分散在其他的城市不过,他发现一个巧合所有地址都恰好分散在一条铁路线上。他准备发出邀请但无法决定应该在哪个地方举行宴会最后他决定选择一个地点,使大家旅荇的总花费最小我们的主人公既不擅长数学,也不擅长计算机他请你这个NOIP的高手帮忙写一个程序,根据他同学的地址选择聚会的最佳地点。
输入文件的每一行描述了一个城市的信息(不超过10000个城市),首先是城里同学的个数(保证总人数在2^32范围内)紧跟着是这个城市到Moscow(起始点)的距离(km),最后是城市的名称最后一行描述的总是Moscow,它在铁路线的一端距离为0,三个数据之间分别用空格隔开
輸出聚会地点城市名称和旅程费用(单程),两者之间用一个空格隔开每km花费1元人民币。总距离保证在2^64范围内
我看到很多人用的是O(n2)的暴力做,可这是加强版的题n2看上去过不了(可实际上数据太水,可以卡过)
枚举每个城市,然后在每个城市枚举别的城市记录和,維护最小值就OK了。
这种方法属于一种dp的方式因为我可以利用原点的值,进而推出下一个城市的值
我们设num[i],km[i],name[i],表示城市i的人数,距离和名芓(注意,这个算法要保证km数组要有序所以我们要以km为关键字排序)。
qzh[i]表示0号城市到i号的前缀和
然后,我们想从一个点到另一个點是有一边增加,有一边减少这样转移方程就看得出来了: