제출 #698580

#제출 시각아이디문제언어결과실행 시간메모리
698580RichemWatching (JOI13_watching)C++14
100 / 100
264 ms32808 KiB
#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;

const int MAX_NOMBRE = 2042, INF = 1e9;

int nbPos, nbPetit, nbGrand;
multiset<int> pos;

unordered_map<int, int> idPos;

void input() {
    cin >> nbPos >> nbPetit >> nbGrand;
    nbPetit = min(nbPetit, nbPos);
    nbGrand = min(nbGrand, nbPos);

    for(int cur = 0; cur < nbPos; cur++) {
        int posCur;
        cin >> posCur;

        pos.insert(posCur);
    }
    
    int idCur = 1;
    for(auto cur : pos) {
        idPos[cur] = idCur++;
    }
}

int getPos(int posInit, int dist) {
    auto it = pos.lower_bound(posInit - dist+1);

    if(it == pos.begin()) {
        return 0;
    }
    it--;
    return idPos[*it];
}

int dp[MAX_NOMBRE][MAX_NOMBRE];

int temps[MAX_NOMBRE][MAX_NOMBRE] = {0};
int idTemps = 1;

bool possible(int taille) {
    dp[0][0] = 0;

    int curPt = 1;
    for(auto valPt : pos) {
        int precedPetit = getPos(valPt, taille), precedGrand = getPos(valPt, taille*2);
        for(int curPetit = 0; curPetit <= nbPetit; curPetit++) {
            if(temps[curPt][curPetit] < idTemps) {
                dp[curPt][curPetit] = INF;
                temps[curPt][curPetit] = idTemps;
            }
            if(curPetit > 0) {
                dp[curPt][curPetit] = min(dp[curPt][curPetit], dp[precedPetit][curPetit-1]);
            }
            dp[curPt][curPetit] = min(dp[curPt][curPetit], dp[precedGrand][curPetit] + 1);

            if(curPt == nbPos && dp[curPt][curPetit] <= nbGrand) {
                idTemps++;
                return 1;
            }
        }
        curPt++;
    }
    idTemps++;

    return 0;
}

int dicho() {
    int deb = 1, fin = INF;

    while(deb < fin) {
        int milieu = (deb + fin) / 2;

        if(possible(milieu)) {
            fin = milieu;
        }
        else {
            deb = milieu+1;
        }
    }

    return deb;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    input();

    for(int i = 0; i < MAX_NOMBRE; i++) {
        for(int j = 0; j < MAX_NOMBRE; j++) {
            dp[i][j] = INF;
        }
    }

    cout << dicho();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...