結果
問題 |
No.370 道路の掃除
|
ユーザー |
|
提出日時 | 2016-08-17 10:14:30 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,861 bytes |
コンパイル時間 | 783 ms |
コンパイル使用メモリ | 62,492 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-07 18:44:36 |
合計ジャッジ時間 | 1,723 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 34 |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #define MAX_M 1000 using namespace std; int main(){ int n,m; cin >> n;//ひろうゴミの数 cin >> m;//落ちているゴミの総数 int D[MAX_M]; int min_len = 9999999; int len = 0; for(int d = 0; d < m; d++) cin >> D[d]; /* N個のごみを拾うための最短距離 距離がマイナスのところのゴミを拾うとき、 */ sort(D, D + m);//とりあえずソートする() /* 距離がマイナスのところだけをひろう → 一番遠いところのABS取る 距離がプラスのところだけをひろう →一番遠いところのABSを取る 距離がプラスとマイナスのところをひろう → マイナスの座標の絶対値の2倍+プラスの座標が答え(一回戻る必要がある) マイナスとプラスの座標のゴミをひろうとき、どっちからひろうかで最短距離が変わることに注意がいる。 →プラスが15、マイナスが10の時:プラスの方からひろうと15*2+10=40だが、マイナスからならば10*2+15=35 になり最短距離がでる。 */ // cout << endl; for(int d = 0; d < m - n + 1; d++){ // cout << "D[" << d << "] :" << D[d]; // cout << " | D[" << d + n - 1 << "] :" << D[d+n-1] << endl; if(D[d] <= 0 && D[d+n-1] <= 0){//座標がマイナスのところだけ len = -D[d]; } else if(D[d] >= 0 && D[d+n-1] >= 0){//座標がプラスのところだけ len = D[d+n-1]; } else { len = min(D[d+n-1]*2-D[d],D[d+n-1] - D[d] * 2);//マイナスの座標のぶんだけ最初行ってからでないとだめ } if(len < min_len){ min_len = len; // cout << "更新 "; } // cout << "len:" << len << endl; len = 0; } cout << min_len << endl; return 0; }