1852アリ
件名
木の棒の上を這う蟻はなく、各蟻の速度は1秒あたり1単位の長さです。これで、すべての蟻の初期位置が示されます(蟻の移動方向は決定されません)。すべてのアリがスティックを落とす最短の時間と最長の時間。
入力
入力の最初の行には、後続のケースの数を示す整数が含まれています。各ケースのデータは2つの整数で始まります:ポールの長さ(センチメートル)とn(ポール上のアリの数)。これらの2つの数値の後にn整数が続き、ロッドの左端からの距離(順不同)で、ロッド上の各アリの位置を示します。すべての入力整数は1000000以下であり、スペースで区切られています。
出力
入力ケースごとに、スペースで区切られた2つの数値を出力します。最初の数値はすべてのアリが落下する可能性のある最も早い時間(歩行方向が正しく選択されている場合)で、2番目の数値は最も遅い可能性のある時間です。
入力例
2
10 3
2 6
7214 7
11 12 7 13 176 23191
出力例
4 8
38 207
解決
水問題は
小学校のオリンピアードの遭遇問題に似て
います。2つの間の距離の合計は2n
です。
蟻は遭遇後に向きを変えず、Uターンの合計距離は変わりません。
直接の欲によって、各蟻は最も近いエンドポイントまで歩くことができます。
暴力と貪欲は終わった...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
// #define int long long
using namespace std;
inline int read(){
int x = 0, w = 1;
char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
int main(){
int T = read();
int maxv = 0, minv = 0;
while(T--){
int l = read(), n = read();
maxv = 0, minv = 0;
int tmp = 0;
for(int i = 1; i <= n; i++){
tmp = read();
maxv = max(maxv, max(tmp, l - tmp));
minv = max(minv, min(tmp, l - tmp));
}
cout << minv << " " << maxv << endl;
}
return 0;
}