题目描述
毕业25年以后,我们的主人公开始准备同学聚会。打了无数电话后他终于搞到了所有同学的地址。他们有些人仍在本城市,但大多数人分散在其他的城市。不过,他发现一个巧合,所有地址都恰好分散在一条铁路线上。他准备出发邀请但无法决定应该在哪个地方举行宴会。最后他决定选择一个地点,使大家旅行的花费和最小。
不幸的是,我们的主人公既不擅长数学,也不擅长计算机。他请你帮忙写一个程序,根据他同学的地址,选择聚会的最佳地点。花费相同时优先取靠近莫斯科的城市。
输入格式
输入数据的每一行描述一个城市的信息。对于每个城市,
首先是城市里同学的个数,紧跟着是这个城市到 Moscow(起点站)的距离(单位 kmkm),最后是城市的名称。最后一行描述的总是 Moscow,它在铁路线的一端,距离为 00。
输出格式
聚会地点城市名称和旅行费用(单程),两者之间用一空格隔开。每 kmkm 花费一个卢布。
样例输入
7 9289 Vladivostok 5 8523 Chabarovsk 3 5184 Irkutsk 8 2213 Yalutorovsk 10 0 Moscow
样例输出
Yalutorovsk 112125
说明/提示
数据范围及约定
对于全部数据,保证城市数量 ≤150≤150,距离 ≤10000≤10000,同学个数 ≤50≤50。
参考代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#define ll long long
using namespace std;
struct city
{
ll jl; //从起点到这里的距离
string name; //城市的名字
ll people; //在这个城市里的同学人数
ll q; //从这里到起点的钱数(卢布)
};
city a[10005];
bool cmp(city x, city y)
{
if(x.q < y.q) //花费少的在前
return true;
else if(x.q == y.q) //如果钱数相同,就判断距离起点路程短的在前
{
if(x.jl < y.jl)
return true;
}
return false;
}
int main()
{
ll j, t = 1, i, cnt = 0;
while(cin>>a[t].people>>a[t].jl>>a[t].name) //循环输入
{
if(a[t].name == "Moscow") //城市名字为"Moscow"退出
break;
t++;
}
//cout<<"hello"; 测试程序
for(i = 1; i <= t; i++)
{
a[i].q = 0; //清零,否则可能为乱码
for(j = 1; j <= t; j++)
{
a[i].q += abs(a[j].jl - a[i].jl) * a[j].people;
// a[i]的花费 = a[j]城市的距离 - a[i]城市的距离 * a[j]城市人数
}
}
sort(a + 1, a + t, cmp); //排序
cout<<a[1].name<<" "<<a[1].q;
return 0;
}