TopCoder SRM 605 Div1 Easy AlienAndHamburgers

問題

n個のハンバーガーがあり、それぞれ種類がtype[i], 味がtaste[i]である。
この中からエイリアンに食べさせるハンバーガーを選ぶ。
エイリアンの満足度は、食べさせたハンバーガーのうち異なるtypeが何種類あるかをY
食べさせたハンバーガーの味の合計をAとすると、Y * Aである。


得られる満足度の最大値を求めよ。

制約条件

n≦50
type[i]≦100
taste[i]の絶対値≦10000

方針

tasteが負でないハンバーガーは全部食べさせて損にならない。
tasteが負であるハンバーガーは、種類を増やすために食べさせるかもしれない。
以下tasteが負であるハンバーガーだけ考える。


同じtypeで、tasteが負でないハンバーガーがあったらそのハンバーガーは使わない。
また、同じtypeのハンバーガーのうち、使うのはtasteが一番マシなハンバーガーだけ。


なのでその種類を増やすのに使うハンバーガーの候補をリストアップして、そのうち何種類を使うか全通り試せばいい。
これは候補をtasteをマシな順にソートして、マシなほうからi個使えばいい。

ソースコード

class AlienAndHamburgers {
	public:
	int getNumber(vector <int> type, vector <int> taste) {
		
		int n = type.size();
		int types = 0, tastes = 0;
		vi nega;
		bool use[110] = {};
		
		rep(i, n){
			if(use[type[i]]) continue;
			use[type[i]] = 1;
			
			int mx = -inf;
			rep(j, n) if(type[j] == type[i]){
				
				mx = max(mx, taste[j]);
				if(taste[j] >= 0) tastes += taste[j];
			}
			if(mx >= 0) types++;
			else nega.pb(mx);
		}
		sort(all(nega), greater<int>());
		int ans = types * tastes;
		
		rep(i, nega.size()){
			types++;
			tastes += nega[i];
			ans = max(ans, types * tastes);
		}
		return ans;
	}
};