题意:

        长为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 ;
}

 

posted on 2011-08-20 10:33  追逐.  阅读(921)  评论(0编辑  收藏  举报