SRM 561 div2
レート上がらない…
easyしか分からなかった
medは制約の読み間違えというクズいことをして、全探索するだけなのに気づかなかった。
気づけたとしても実装重めなので、できなかったかもしれない(小並感)
250
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; class FoxAndVacation{ public: int maxCities(int total, vector <int> d){ sort(d.begin(), d.end()); int n = 0, i; for(i = 0; i < d.size(); i++){ if(n + d[i] > total) break; n += d[i]; } return i; } };
500
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; const int INF = 1 << 29; class ICPCBalloons{ public: vector<int> lc; vector<int> mc; int ls, ms; int minRepaintings(vector <int> bC, string bS, vector <int> mAC){ ls = ms = 0; for(int i = 0; i < bC.size(); i++){ if(bS[i] == 'L'){ ls += bC[i]; lc.push_back(bC[i]); }else{ ms += bC[i]; mc.push_back(bC[i]); } } sort(lc.begin(), lc.end()); reverse(lc.begin(), lc.end()); sort(mc.begin(), mc.end()); reverse(mc.begin(), mc.end()); sort(mAC.begin(), mAC.end()); reverse(mAC.begin(), mAC.end()); int ans = INF; for(int i = 0; i < (1 << mAC.size()); i++){ // 0..L 1..M int l = 0, m = 0; for(int j = 0; j < mAC.size(); j++){ if(((i >> j) & 1) == 0) l += mAC[j]; else m += mAC[j]; } if(l <= ls && m <= ms){ int t = 0; bool u_l[lc.size()]; bool u_m[mc.size()]; fill(u_l, u_l + lc.size(), false); fill(u_m, u_m + mc.size(), false); for(int j = 0; j < mAC.size(); j++){ bool f = true; if(((i >> j) & 1) == 0){ for(int k = 0; k < lc.size(); k++){ if(!u_l[k]){ u_l[k] = true; t += (mAC[j] < lc[k]) ? 0 : (mAC[j] - lc[k]); f = false; break; } } }else{ for(int k = 0; k < mc.size(); k++){ if(!u_m[k]){ u_m[k] = true; t += (mAC[j] < mc[k]) ? 0 : (mAC[j] - mc[k]); f = false; break; } } } if(f) t += mAC[j]; } ans = min(ans, t); } } return (ans == INF) ? -1 : ans ; } };