(File IO): input:reuntion.in output:reuntion.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
毕业20年以后,我们的主人公开始准备同学聚会。打了无数电话后他终于搞到了所有同学的地址。他们有些人仍在本市,但大多数人分散在其他的城市。不过,他发现一个巧合,所有地址都恰好分散在一条铁路线上。他准备发出邀请但无法决定应该在哪个地方举行宴会。最后他决定选择一个地点,使大家旅行的总花费最小。我们的主人公既不擅长数学,也不擅长计算机。他请你这个NOIP的高手帮忙写一个程序,根据他同学的地址,选择聚会的最佳地点。
输入
输入文件的每一行描述了一个城市的信息。(不超过
10000
10000
10000个城市),首先是城里同学的个数(保证总人数在
2
3
2
2^32
232范围内),紧跟着是这个城市到
M
o
s
c
o
w
Moscow
Moscow(起始点)的距离(
k
m
km
km),最后是城市的名称。最后一行描述的总是
M
o
s
c
o
w
Moscow
Moscow,它在铁路线的一端,距离为
0
0
0,三个数据之间分别用空格隔开。
输出
输出聚会地点城市名称和旅程费用(单程),两者之间用一个空格隔开。每
k
m
km
km花费
1
1
1元人民币。总距离保证在
2
6
4
2^64
264范围内。
样例输入
7 9289 Vladivostok
5 8523 chabarovsk
3 5184 Irkutsk
8 2213 Yalutorovsk
10 0 Moscow
样例输出
Yalutorovsk 112125
数据范围限制
解题思路
找到聚会地点然后模拟就好。。。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<map>
using namespace std;
long long n,maxn,mid,i,j,t,ans;
struct c
{
long long x,y;
string s;
}a[100010];
bool cmp(const c&l,const c&r)
{
return l.y<r.y;
}
int main() {
freopen("reuntion.in","r",stdin);
freopen("reuntion.out","w",stdout);
n=1;
while(scanf("%lld %lld",&a[n].x,&a[n].y)) {
cin>>a[n].s;
maxn+=a[n].x;
if(a[n].s=="Moscow")
break;
else
n++;
}
sort(a+1,a+n+1,cmp);
mid=(maxn+1)/2;
t=0;
for(i=1; i<=n; i++) {
if(t+a[i].x>mid)
break;
else
t=t+a[i].x;
}
cout<<a[i].s<<" ";
ans=0;
for(j=1; j<=n; j++)
{
ans+=abs((a[j].y-a[i].y))*a[j].x;
}
printf("%d",ans);
}