結果
| 問題 |
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;
}