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...