Submission #537889

#TimeUsernameProblemLanguageResultExecution timeMemory
537889nicolexxuuBank (IZhO14_bank)C++14
100 / 100
118 ms8540 KiB
//#include <bits/stdc++.h> //#define MAXN 21 //using namespace std; // //int a[MAXN], b[MAXN]; //bool possible[MAXN][1 << MAXN]; //vector<int> combos[MAXN * 1000]; //int N, M; // //int main() { // ios_base::sync_with_stdio(0); // cin.tie(NULL); // cin >> N >> M; // for(int i = 0; i < N; i++) cin >> a[i]; // for(int i = 0; i < M; i++) cin >> b[i]; // // for(int mask = 0; mask < (1 << M); mask++) { // int sum = 0; // for(int i = 0; i < M; i++) { // if(mask & (1 << i)) sum += b[i]; // } // combos[sum].push_back(mask); // } // // possible[0][0] = true; // for(int i = 0; i < N; i++) { // for(int mask = 1; mask < (1 << M); mask++) { // for(int combo : combos[a[i]]) { // if((combo & mask) == combo) possible[i+1][mask] |= possible[i][mask - combo]; // } // } // } // // bool res = false; // for(int i = 0; i < (1 << M); i++) res |= possible[N][i]; // if(res) cout << "YES\n"; // else cout << "NO\n"; //} #include <iostream> #include <vector> using std::cout; using std::endl; using std::vector; int main() { int people_num; int note_num; std::cin >> people_num >> note_num; vector<int> people(people_num); vector<int> banknotes(note_num); for (int& p : people) { std::cin >> p; } for (int& b : banknotes) { std::cin >> b; } vector<int> leftover(1 << note_num, -1); vector<int> people_covered(1 << note_num, -1); leftover[0] = 0; people_covered[0] = 0; for (int s = 0; s < (1 << note_num); s++) { for (int last = 0; last < note_num; last++) { if ((s & (1 << last)) == 0) { continue; } int prev = s & ~(1 << last); if (people_covered[prev] == -1) { continue; } int new_amt = leftover[prev] + banknotes[last]; // the salary of the current person we're going to try to pay int curr_target = people[people_covered[prev]]; // if it's still not enough, just increment the leftover pile if (new_amt < curr_target) { people_covered[s] = people_covered[prev]; leftover[s] = new_amt; } /* * or it's exactly right, in which case reset the leftover count * and increment the covered amount */ else if (new_amt == curr_target) { people_covered[s] = people_covered[prev] + 1; leftover[s] = 0; } } // we've covered all the people! if (people_covered[s] == people_num) { cout << "YES" << endl; return 0; } } cout << "NO" << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...