UVa12269 Lawn mower

解法
位置をソートして、隣との幅が W 以内かを見ていく、かつ芝を端まで刈れているかを調べるだけ。

#include <bits/stdc++.h>

using namespace std;

#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define rep(i,n) REP(i,0,n)
#define allof(c) (c).begin(), (c).end()

double const MAX_L = 75.;
double const MAX_W = 100.;

bool solve(vector<double> const &VEC, double K, double MAX) {
  if( VEC[0]-K/2. > 0. || VEC.back() + K/2. < MAX) { return false; }
  bool ret = true;
  REP(i,1,VEC.size()) {
    ret = ret && (VEC[i]-VEC[i-1] <= K);
  }
  return ret;
}

int main() {
  int N, M; double K;
  while(cin >> N >> M >> K && N) {
    vector<double> LEN(N), WIDTH(M);
    rep(i, N) cin >> LEN[i];
    rep(i, M) cin >> WIDTH[i];
    sort(allof(LEN)); sort(allof(WIDTH));
    if( solve(LEN, K, MAX_L) && solve(WIDTH, K, MAX_W) ) {
      cout << "YES" << endl;
    }
    else {
      cout << "NO" << endl;
    }
  }
  
  return 0;
}