POJ 1852アリ(貪欲)

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

おすすめ

転載: www.cnblogs.com/rui-4825/p/12700065.html