Submission #882125

#TimeUsernameProblemLanguageResultExecution timeMemory
882125StefanL2005Bank (IZhO14_bank)C++14
0 / 100
116 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;
ifstream in("bank.in");
ofstream out("bank.out");

struct keyData{
    int key, sum; 
};

int readBin(int k, vector<int> &Money)
{
    int pos = 0, sum = 0;

    while (k != 0)
    {
        if ( (k & 1) == 1)
            sum+= Money[pos];
        pos++;
        k = (k >> 1);
    }

    return sum;
}

bool rule(keyData A, keyData B)
{
    if (A.sum == B.sum)
        return A.key < B.key;
    return A.sum < B.sum;
}

bool FindAnswer(int L, int n, int K, vector<keyData> &Pos, vector<int> &Start)
{
    if (L == n)
        return true;
    
    int i = Start[L];

    while (i < Pos.size() && Pos[i].sum == Pos[Start[L]].sum)
    {
        if ( (K & Pos[i].key) == 0)
            if(FindAnswer(L + 1, n, K + Pos[i].key, Pos, Start))
                return true;    
        i++;
    }

    return false;
}

int main()
{
    int n, m; in>> n >> m;
    vector<int> People(n), Money(m);
    
    int var = (1 << m);
    vector<keyData> Pos(var);

    for (int i = 0; i < n; i++)
        in>> People[i];
    for (int i = 0; i < m; i++)
        in>> Money[i];

    for (int i = 0; i < var; i++)
    {
        Pos[i].key = i;
        Pos[i].sum = readBin(i, Money);
    }

    sort(Pos.begin(), Pos.end(), rule);

    vector<int> start(n);
    for (int i = 0; i < n; i++)
    {
        keyData A; A.key = 0; A.sum = People[i];
        start[i] = lower_bound(Pos.begin(), Pos.end(), A, rule) - Pos.begin();
    
        if (Pos[start[i]].sum != People[i])
        {
            out<< "NO";
            return 0;
        }
    }
    
    if (FindAnswer(0, n, 0, Pos, start))
        out<< "YES";
    else
        out<< "NO";

    return 0;
}

Compilation message (stderr)

bank.cpp: In function 'bool FindAnswer(int, int, int, std::vector<keyData>&, std::vector<int>&)':
bank.cpp:39:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<keyData>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |     while (i < Pos.size() && Pos[i].sum == Pos[Start[L]].sum)
      |            ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...