SRM605 div1 Easy AlienAndHamburgers
メモ
tasteが正なら絶対食べた方が良い
tasteが負の場合はそのハンバーガーを食べることで種類が増えるなら、食べるとjoiを大きくできる可能性がある
tasteが負のハンバーガーしかない種類については、tasteが一番大きいハンバーガーだけを食べるか食べないか考えれば良い(種類を増やすならtasteが一番大きいのを選んだ方が良い)
tasteが負のハンバーガーしかない種類ごとに、食べるか食べないかの1つのハンバーガーの候補を保存しとく
それらの候補の中でtasteが大きいものから順にjoiが大きくなる間食べれば良い(種類を増やすならtasteが大きいものから食べた方が良い)
コード
class AlienAndHamburgers { public: int getNumber(vector <int> type, vector <int> taste) { int n = type.size(); bool plus[101]; CLR(plus); // プラスがあるタイプかどうか FOR(i,0,n) if(taste[i] >= 0) plus[type[i]] = true; bool usedType[101]; CLR(usedType); int Y = 0, A = 0; vector<int> v[101]; FOR(i,0,n) { // +ならくう if(taste[i] >= 0) { if(!usedType[type[i]]) { Y++; usedType[type[i]] = true; } A += taste[i]; } // tasteがマイナスだけどtype数増えるからスコア上がるかも else if(!plus[type[i]]) { v[type[i]].push_back(taste[i]); } } vector<int> vv; FOR(i,0,101) { if(v[i].size() > 0) { sort(v[i].rbegin(), v[i].rend()); vv.push_back(v[i][0]); } } sort(vv.rbegin(), vv.rend()); int ret = Y * A; FOR(i,0,vv.size()) { Y++; A += vv[i]; ret = max(ret, Y * A); } return ret; } };
メモが雑...