Skip to content

11304: 【原1304】动量守恒

题目

题目描述

author: were 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1304

Description

时间限制:0.5s 空间限制:64MB

在一个长度为L m的平台上,放着N个质量相同的小球,每个小球的初始速度都为1m/s,

小球的运动方向按照摆上去的顺序间隔着向左或者向右,第一个摆上去小球的运动方向向右。

然后问题来了,小球我们认为小球的体积很小,

碰撞满足动量守恒定律,且发生完全弹性碰撞,碰撞不发生能量损失,碰撞的时间非常短暂可以忽略。

问平台上的第一个和最后一个小球分别是在什么时候掉下去的。

Input Format

输入共有两行。

第1行有2个整数,表示小球的数量N和平台的长度L。

第2行有N个整数,分别表示小球在平台上的位置,按照小球摆上去的顺序给出,平台的左端点位置为0,右端点位置为L。

保证开始的时候没有两个小球在一个位置。

Output Format

输出只有一行,两个整数。

分别表示小球最早掉下去的时间和最晚掉下去的时间。

Sample Input

5 10
1 3 5 7 9

Sample Output

1 9

Data Range

对于10%的数据,N,L<=10。

对于100%的数据,N<=10000,L<=1000000000,小球的位置在0..L之间。

鉴于前面几次机考总是有人写十个点各1s的暴力,为了节约大家反复提交进行评测的时间,特此0.5s。

skyzh's solution

#include <iostream>
using namespace std;

int main() {
    int N;
    long long L;
    long long T1 = -1, T2 = -1;
    cin >> N >> L;
    bool left = false;
    for (int i = 0; i < N; i++) {
        long long T;
        cin >> T;
        if (!left) T = L - T;
        left = !left;
        if (T1 == -1 || T < T1) T1 = T;
        if (T2 == -1 || T > T2) T2 = T;
    }
    cout << T1 << " " << T2 << endl;
}