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 ;
	}
};