班级聚会(reunion)

本题连接 http://59.61.75.5:8888/JudgeOnline/showproblem?problem_id=1589

班级聚会 2010-10-31普及模拟赛(reunion)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:77 Accepted:22

Description

毕业25年以后,我们的主人公开始准备同学聚会。打了无数电话后他终于搞到了所有同学的地址。
他们有些人仍在本城市,但大多数人分散在其他的城市。
不过,他发现一个巧合,所有地址都恰好分散在一条铁路线上。他准备出发邀请但无法决定应该在哪个地方举行宴会。
最后他决定选择一个地点,使大家旅行的花费和最小。
不幸的是,我们的主人公既不擅长数学,也不擅长计算机。他请你帮忙写一个程序,根据他同学的地址,选择聚会的最佳地点。

Input

输入文件的每一行描述了一个城市的信息,最多100000个城市。

首先是城市里同学的个数(<=1000);
紧跟着是这个城市到Moscow(起点站)的距离(km)(<=maxlongint);
最后是城市的名称(长度小于200个字符)。

最后一行描述的总是Moscow,它在铁路线的一端,距离为0。

Output

聚会地点城市名称和旅行费用(单程),两者之间用一空格隔开。每km花费一个卢布。

Sample Input

7 9289 Vladivostok	
5 8523 Chabarovsk
3 5184 Irkutsk
8 2213 Yalutorovsk
10 0 Moscow

 

Sample Output

Yalutorovsk 112125

program P1589; var n,sum:longint; name:array[0..100001] of string; num,d:array[0..100001] of longint; procedure init; var ch:char; begin n:=1; read(num[n],d[n]); read(ch); readln(name[n]); sum:=num[n]; while pos('Moscow',name[n])=0 do begin inc(n); read(num[n],d[n]); read(ch); readln(name[n]); sum:=sum+num[n]; end; end; procedure sort(s,e:longint); var i,j,tnum,td,r:longint; tname:string; begin i:=s; j:=e; r:=random(e-s)+s; tnum:=num[r]; td:=d[r]; tname:=name[r]; num[r]:=num[s]; d[r]:=d[s]; name[r]:=name[s]; while i<j do begin while (i<j) and (d[j]<td) do dec(j); if i<j then begin d[i]:=d[j]; num[i]:=num[j]; name[i]:=name[j]; inc(i); end; while (i<j) and (d[i]>td) do inc(i); if i<j then begin d[j]:=d[i]; num[j]:=num[i]; name[j]:=name[i]; dec(j); end; end; num[i]:=tnum; d[i]:=td; name[i]:=tname; if s<i-1 then sort(s,i-1); if j+1<e then sort(j+1,e); end; procedure work; var mid,total,i,j:longint; tint64:int64; begin //for i:=1 to n do writeln(num[i],' ',d[i],' ',name[i]); mid:=(sum+1) div 2; total:=0; for i:=1 to n do begin if total+num[i]>mid then begin break end else total:=total+num[i]; end; write(name[i],' '); tint64:=0; for j:=1 to n do tint64:=tint64+abs((d[j]-d[i]))*num[j]; writeln(tint64); end; begin init; sort(1,n); work; end.

你可能感兴趣的:(班级聚会(reunion))