Submission #571072

#TimeUsernameProblemLanguageResultExecution timeMemory
571072webDetecting Molecules (IOI16_molecules)C++17
69 / 100
6 ms1020 KiB
#include <set> #include <iostream> #include "molecules.h" #include <algorithm> using namespace std; vector<vector<int>> dp; void knapsack(vector<int>& weights, int u) { for(int i = 0; i<weights.size(); ++i) { for(int weight = 0; weight <= u; ++weight) { if(weight < weights[i]) { dp[i+1][weight] = dp[i][weight]; } else { if(dp[i][weight] >= dp[i][weight - weights[i]]+ weights[i]) { dp[i+1][weight] = dp[i][weight]; } else { dp[i+1][weight] = dp[i][weight-weights[i]] + weights[i]; } } } } } std::vector<int> find_subset(int l, int u, std::vector<int> w) { vector<pair<int,int>> wP(w.size()); for(int i = 0; i<w.size(); ++i) { wP[i] = {w[i], i}; } sort(wP.begin(), wP.end()); //construct prefix int currSum = 0; int bad_index = 0; int n = wP.size(); for(bad_index = 0; bad_index <n; ++bad_index) { currSum += wP[bad_index].first; if(currSum > u) break; } if(bad_index == 0) return vector<int>(0); set<pair<int,int>> molsWanted, molsRemaining; int sumWanted = 0; for(int i = 0; i< bad_index; ++i) { molsWanted.insert(wP[i]); sumWanted += wP[i].first; } for(int i = bad_index; i<n; ++i) molsRemaining.insert(wP[i]); while(sumWanted < l && !molsRemaining.empty()) { if(molsWanted.begin() -> first == molsRemaining.rbegin() -> first) break; sumWanted += molsRemaining.rbegin() -> first - molsWanted.begin() -> first; auto deleteEL = *molsWanted.begin(); auto insEl = *molsRemaining.rbegin(); molsRemaining.erase(insEl); molsWanted.erase(deleteEL); molsWanted.insert(insEl); } if(sumWanted < l) { return vector<int>(0); } vector<int> retVal; for(auto elemenet: molsWanted) retVal.push_back(elemenet.second); return retVal; }

Compilation message (stderr)

molecules.cpp: In function 'void knapsack(std::vector<int>&, int)':
molecules.cpp:10:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   10 |     for(int i = 0; i<weights.size(); ++i)
      |                    ~^~~~~~~~~~~~~~~
molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:38:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     for(int i = 0; i<w.size(); ++i)
      |                    ~^~~~~~~~~
#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...