SRM613 Div1 Easy TaroFriends

問題概要

N匹の猫を今いる座標から左右どちらかにx動かしたとき,猫のいる範囲の最小値はいくつか

解法

右端左端を全通り試し,すべての猫が中にいれば答えを更新.
The 愚直だが,割と出てこなかったので反省.

ソースコード

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,n,m) for(int i=(n);i<(m);i++)
#define REP(i,n) FOR(i,0,n)
#define REPR(i,n) for(int i=(n);i>=0;i--)
#define all(vec) vec.begin(),vec.end()
using vi=vector<int>;
using vvi=vector<vi>;
using vl=vector<ll>;
using vvl=vector<vl>;
using P=pair<ll,ll>;
using PP=pair<ll,P>;
using vp=vector<P>;
using vpp=vector<PP>;
using vs=vector<string>;
#define fi first
#define se second
#define pb push_back
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;}
const ll MOD=1000000007LL;
const int INF=1<<30;
const ll LINF=1LL<<60;
class TaroFriends{
public:
    int getNumber(vi a,int x){
        int res=INF;
        int n=a.size();
        REP(i,n){
            REP(j,n){
                FOR(k,-1,2){
                    if(!k){
                        continue;
                    }
                    FOR(l,-1,2){
                        if(!l){
                            continue;
                        }
                        int p=min(a[i]+x*k,a[j]+x*l),q=max(a[i]+x*k,a[j]+x*l);
                        bool f=true;
                        REP(m,n){
                            if((p<=a[m]+x&&a[m]+x<=q)||(p<=a[m]-x&&a[m]-x<=q)){
                                continue;
                            }
                            f=false;
                        }
                        if(f){
                            chmin(res,q-p);
                        }
                    }
                }
            }
        }
        return res;
    }
};