Submission #530542

#TimeUsernameProblemLanguageResultExecution timeMemory
530542LFFBHotel (CEOI11_hot)C++14
40 / 100
8 ms10420 KiB

#include <iostream>
#include <algorithm>

#define debug(args...) //printf(args)

typedef long long llong;

const int MAX_N = 100 + 10;
const llong INF = 1000000000000000000;

int n, m, o;

std::pair<int, int> rooms[MAX_N]; // (upkeep, capacity)
std::pair<int, int> offers[MAX_N]; // (pay, demand)

bool  isStored[MAX_N][MAX_N][MAX_N];
llong storedDP[MAX_N][MAX_N][MAX_N];

void setMax(llong& a, llong b) {
    a = std::max(a, b);
}
void setMin(int& a, int b) {
    a = std::min(a, b);
}

// dp[i][j][k] = max profit with only first i room and first j offer with at max k accepted offer
llong dp(int room, int offer, int accept) {

    if (accept == 0) return 0;
    if (offer == -1) return 0;
    if (room == -1) return 0;

    setMin(accept, offer + 1);

    if (isStored[room][offer][accept]) return storedDP[room][offer][accept];

    llong answer = 0;

    setMax(answer, dp(room - 1, offer, accept));
    setMax(answer, dp(room, offer - 1, accept));
    if (rooms[room].second >= offers[offer].second) {
        debug("capacity of %d > demand of %d\n", room, offer);
        setMax(answer, dp(room - 1, offer - 1, accept - 1) + offers[offer].first - rooms[room].first);
    }

    isStored[room][offer][accept] = true;
    storedDP[room][offer][accept] = answer;
    debug("dp[%d][%d][%d] = %lld\n", room, offer, accept, answer);
    return answer;

}

bool sortingFunction(std::pair<int, int> a, std::pair<int, int> b) {
    if (a.second != b.second) return a.second < b.second;
    return a.first < b.first;
}

int main() {

    scanf("%d %d %d", &n, &m, &o);

    for (int i = 0; i < n; i++) {
        scanf("%d %d", &rooms[i].first, &rooms[i].second);
    }

    for (int i = 0; i < m; i++) {
        scanf("%d %d", &offers[i].first, &offers[i].second);
    }

    std::sort(rooms, rooms + n, sortingFunction);
    std::sort(offers, offers + m, sortingFunction);

    llong answer = dp(n - 1, m - 1, o);

    printf("%lld\n", answer);

}

Compilation message (stderr)

hot.cpp: In function 'int main()':
hot.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |     scanf("%d %d %d", &n, &m, &o);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
hot.cpp:64:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |         scanf("%d %d", &rooms[i].first, &rooms[i].second);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hot.cpp:68:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         scanf("%d %d", &offers[i].first, &offers[i].second);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...