题意:
长为L的月台上有M个人,每人与月台左端距离为Pi,有一列N个门的火车,每个门与最左端的距离为Di。已知每个人会选择离自己最近的车门上车,求火车停靠什么位置能使得所有人的移动距离和最大。
输入:
第一行位L,M,N,第二行为Pi,第三行为Di。
输出:
火车停靠的位置和所有人移动的最长距离和。
要使乘客移动距离最大,则应尽量使更多的乘客正对两个车门中央。初始时,最少可保证一个乘客正对车门中央,然后枚举所有满足此条件火车停靠的位置,计算最大移动距离。当火车停靠最左或最右端时,无法保证上述条件,所以要单独计算,最后与answer比较大小。
#include<iostream>
#include<cstdlib>
using namespace std ;
int n, m, people[1000], door[1000] ;
int count(int s){ //计算停靠s位置时乘客移动的距离
int sum = 0, p = 1, i ;
for(i=1; i<=m; i++){
while(p<n&&abs(door[p+1]+s-people[i])<abs(door[p]+s-people[i]))
p ++ ;
sum += abs(door[p]+s-people[i]) ;
}
return sum ;
}
int main(){
int answer = -1 ;
int i, j, l, d, p, s ;
cin >> l >> m >> n ;
for(i=1; i<=n; i++)
cin >> people[i] ;
for(i=1; i<=m; i++)
cin >> door[i] ;
for(i=1; i<=n-1; i++) //至少一个乘客正对某车门
for(j=1; j<=m; j++){
s = people[j]-(door[i]+door[i+1])/2 ;
if(s>=0&&s+door[n]<l){
d = count(s) ;
if(d>answer){
answer = d ;
p = s ;
}
}
}
d = count(0) ; //火车停靠月台左端
if(d>answer){
answer = d ;
p = 0 ;
}
d = count(l-door[n]) ; //火车停靠月台右端
if(d>answer){
answer = d ;
p = l - door[n] ;
}
cout << p/2 << " " << answer/2 << endl ;
return 0 ;
}