AOJ 0539 Pizza
昨日は13日の金曜日で本当にひどい目に会いました…
今日は記念すべきCodeforces Round #200です!
解法
本店からの距離d[i]をソートして、距離d[i]とd[j]との間ならその2つの店舗との距離の短い方をとって答えに加算。番兵(?)としてn+1個目の店舗が距離dにあるという情報を入れています。
ソースコード
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <complex> #include <string> #include <sstream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <functional> #include <iostream> #include <map> #include <set> using namespace std; typedef pair<int,int> P; typedef long long ll; typedef vector<int> vi; typedef vector<ll> vll; #define pu push #define pb push_back #define mp make_pair #define eps 1e-9 #define INF 2000000000 #define sz(x) ((int)(x).size()) #define fi first #define sec second #define SORT(x) sort((x).begin(),(x).end()) #define all(x) (x).begin(),(x).end() #define EQ(a,b) (abs((a)-(b))<EPS) int main() { while(1) { int d,n,m; vector<int> vec; vec.pb(0); cin >> d; vec.pb(d); if(d==0)break; cin >> n; cin >> m; for(int i=0;i<n-1;i++) { int k; cin >> k; vec.pb(k); } SORT(vec); int ans=0; for(int i=0;i<m;i++) { int k; cin >> k; vector<int>::iterator it; it=lower_bound(all(vec),k); int p1=(*it); it--; int p2=(*it); ans+=min(abs(p1-k),abs(p2-k)); } cout << ans << endl; } return 0; }