班级聚会

题目描述

毕业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 
#include 
#include 
#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<

你可能感兴趣的:(C++,算法,c++)