Submission #893820

#TimeUsernameProblemLanguageResultExecution timeMemory
893820FanOfWilliamLinBank (IZhO14_bank)C++17
100 / 100
97 ms16872 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define ld long double #define ar array #define vt vector #define pb push_back #define pf push_front #define lb lower_bound #define ub upper_bound #define fi first #define se second #define all(v) v.begin(), v.end() #define pi pair<int, int> #define setmin(x,y) x=(x<y?x:y) #define setmax(x,y) x=(x>y?x:y) #define reset(c,x) memset (c, x, sizeof (c)) ll FIRSTTRUE(function<bool(ll)> f, ll lb, ll rb) { while(lb<rb) { ll mb=(lb+rb)/2; f(mb)?rb=mb:lb=mb+1; } return lb; } ll LASTTRUE(function<bool(ll)> f, ll lb, ll rb) { while(lb<rb) { ll mb=(lb+rb+1)/2; f(mb)?lb=mb:rb=mb-1; } return lb; } const ll INF=1000000000000000000LL; const ll MOD=1e9+7; //const ll MOD=998244353; //sometimes need to be used ll bpow(ll a, ll b) { assert(b>=0); a%=MOD; ll res=1; while(b>0) { if(b&1) res=res*a%MOD; a=a*a%MOD; b>>=1; } return res; } int gcd_x, gcd_y, gcd_d; int gcd(int a, int b) { if (!b) { gcd_x=1; gcd_y=0; return a; } gcd_d=gcd(b, a%b); int tmp=gcd_x; gcd_x=gcd_y; gcd_y=tmp-(a/b)*gcd_y; return gcd_d; } const int d4i[4]={-1, 0, 1, 0}, d4j[4]={0, 1, 0, -1}; const int d8i[8]={-1, -1, 0, 1, 1, 1, 0, -1}, d8j[8]={0, 1, 1, 1, 0, -1, -1, -1}; void solve() { //solve here int people_num, banknote_num; cin >> people_num >> banknote_num; vt<int> salary(people_num), banknote(banknote_num); for(auto& s: salary) { cin >> s; } for(auto& b: banknote) { cin >> b; } vt<int> people_covered(1<<banknote_num, -1); vt<int> leftover(1<<banknote_num, -1); people_covered[0]=0; leftover[0]=0; for(int s=0; s<(1<<banknote_num); ++s) { for(int msk=0; msk<banknote_num; ++msk) { if(!(s&(1<<msk))) { continue; } int prev=s^(1<<msk); if(people_covered[prev]==-1) { continue; } int new_amt=leftover[prev]+banknote[msk]; int curr_target=salary[people_covered[prev]]; if(new_amt<curr_target) { people_covered[s]=people_covered[prev]; leftover[s]=new_amt; } else if(new_amt==curr_target) { people_covered[s]=people_covered[prev]+1; leftover[s]=0; } } if(people_covered[s]==people_num) { cout << "YES\n"; return; } } cout << "NO\n"; } signed main() { ios::sync_with_stdio(0); cin.tie(0); //freopen("template.inp", "r", stdin); //freopen("template.out", "w", stdout); int TC=1; //cin >> TC; while(TC--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...