Submission #1278938

#TimeUsernameProblemLanguageResultExecution timeMemory
1278938SSKMFKnapsack (NOI18_knapsack)C++20
17 / 100
2 ms584 KiB
#include <bits/stdc++.h> using namespace std; vector < pair <int , int> > candidati[2001] , sir[2001]; int maxim[2001] , temporar[2001] , stanga[2001]; int main () { ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int limita , optiuni; cin >> limita >> optiuni; for (int indice = 1 ; indice <= limita ; indice++) { maxim[indice] = -1; } while (optiuni--) { int valoare , greutate , __limita; cin >> valoare >> greutate >> __limita; sir[greutate].emplace_back(valoare , __limita); } for (int greutate = 1 ; greutate <= limita ; greutate++) { sort(sir[greutate].begin() , sir[greutate].end() , greater < pair <int , int> > ()); int suma = 0 , indice = 0; while (indice < (int)sir[greutate].size() && sir[greutate][indice].second + suma <= limita / greutate) { suma += sir[greutate][indice++].second; } sir[greutate].resize(indice); } for (int greutate = 1 ; greutate <= limita ; greutate++) { for (auto& termen : sir[greutate]) { int& valoare = termen.first; int& __limita = termen.second; for (int indice = 0 ; indice < greutate ; indice++) { candidati[indice].clear(); stanga[indice] = 0; } for (int indice = 0 , __indice = 0 ; indice <= limita ; indice++) { if (stanga[__indice] < (int)candidati[__indice].size() && (indice - candidati[__indice][stanga[__indice]].second) / greutate > __limita) { stanga[__indice]++; } temporar[indice] = max(maxim[indice] , stanga[__indice] >= (int)candidati[__indice].size() ? -1 : candidati[__indice][stanga[__indice]].first + indice / greutate * valoare); if (maxim[indice] != -1) { pair <int , int> actual = {maxim[indice] - indice / greutate * valoare , indice}; while (stanga[__indice] < (int)candidati[__indice].size() && candidati[__indice].back().first <= actual.first) { candidati[__indice].pop_back(); } candidati[__indice].push_back(actual); } if (++__indice == greutate) { __indice = 0; } } for (int indice = 0 ; indice <= limita ; indice++) { maxim[indice] = temporar[indice]; } } } int rezultat = 0; for (int indice = 1 ; indice <= limita ; indice++) { rezultat = max(rezultat , maxim[indice]); } cout << rezultat; return 0; }
#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...