いがメモ

プログラミング関連についてやったことの記録を書いていきます。

TopCoder SRM 606 Div1 Easy EllysNumberGuessing [1人競技プログラミング Advent Calendar 2016 8日目]

この記事は1人競技プログラミング Advent Calendar 2016 8日目の記事です。

問題概要:
TopCoder Statistics - Problem Statement
Ellyが1~1,000,000,000までの間の1つの数を選択する。
Ellyに対してguesses[i]の数字を質問した際に、Ellyが考えている数の差分はanswers[i]であると返ってくる。
Ellyの考えている数の答えが一意に定まる場合はその数を返し、一意に定まらないけど複数の候補がある場合は-1を返し、解が存在しない場合は-2を返す。

解いた方法:
guesses[i] - answers[i]とguesses[i] + answers[i]を列挙し、len(guesses)個分ある数が
1個:答え
2個:-1
0個:-2
を返す。試すだけ。

#include<bits/stdc++.h>

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define REP2(i,d,n) for(int i=(d);i<(n);i++)
#define RREP(i,n) for(int i=(n);i>=0;i--)
#define CLR(a)      memset((a),0,sizeof(a))
#define MCLR(a)     memset((a),-1,sizeof(a))
#define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};

class EllysNumberGuessing {
    public:
    vector<int> guesses;
    vector<int> answers;
    int getNumber(vector<int> _guesses, vector<int> _answers) {
        guesses = _guesses, answers = _answers;
        map<int, int> memo;
        REP(i, guesses.size()){
            int l = guesses[i] - answers[i];
            if(0 < l){
                if(memo.count(l) == 0) memo.insert(MP(l, 1));
                else memo[l] += 1;
            }
            int u = guesses[i] + answers[i];
            if(u <= 1000000000){
                if(memo.count(u) == 0) memo.insert(MP(u, 1));
                else memo[u] += 1;
            }
        }

        int res = -2;
        for(auto x : memo){
            if(x.second == guesses.size()){
                if(res == -2) res = x.first;
                else return -1;
            }
        }

        return res;
    }
};