POJ 2674: Linear World

思いがけないところではまったのでメモ.

概要

線分の上を物体がある方向に向かって動く.2つの物体が衝突すると反対に動く.
一番最後に落ちる物体の名前とその時間を求める.

解法

蟻本の蟻と似た考え方.最後に落ちるものを特定するには,左側にどれだけ落ちる物体があるか数えればいい.左右の位置関係は保存されるので,左側の方にあるのが左側に落ちる.

はまったのは,最小値を0からスタートして,インデックスを-1にしていたこと.
落ちる時間が0のときバグってた.

int N;
double L, V;
char D[32010];
double P[32010];
char str[32010][256];
int main(){
    for(;;){
        scanf("%d", &N);
        if(N == 0) return 0;
        scanf("%lf%lf", &L, &V);
        for(int i = 0; i < N; ++i){
            char buf[8];
            scanf("%s%lf%s", buf, P+i, str[i]);
            D[i] = tolower(buf[0]);
        }
        double res = -eps;
        int idx = -1;
        int l = 0;
        for(int i = 0; i < N; ++i){
            double t = L - P[i];
            if(D[i] == 'n' || D[i] == 'N'){
                t = P[i];
                ++l;
            }
            if(t > res){
                res = t;
                idx = i;
            }
        }
        res /= V;
        if(D[idx] == 'p' || D[idx] == 'P')  idx = l;
        else                                idx = l - 1;
        printf("%13.2f %s\n", (int)(res*100)/100.0, str[idx]);
    }
}