牛妹会选择一些同学作为同事,希望选入所有人的Si+Fi的总和最大,并且选中的所个人聪明值与勤奋值的和不能是负数
给出每个同学分别的聪明值和勤奋值,请帮助牛妹求出最大的总和。
5,[-5,8,6,2,8],[7,-6,-3,1,-5]
8
选择第1,3,4位同学,聪明值的总和是-5+6+2=3,勤奋值的总和是7-3+1=5,最终输出8。
注意,,虽然1,2,3,4同学的聪明值和勤奋值总和是10,但是勤奋值的总和是负数,这种情况不可以。
人数小于100输入第一个参数:人数输入第二个参数:每个同学的聪明值输入第三个参数:每个同学的勤奋值
class Solution { public: /** * * @param number int整型 参加校招的同学人数 * @param si int整型一维数组 这个同学的聪明值 * @param siLen int si数组长度 * @param fi int整型一维数组 这个同学的勤奋值 * @param fiLen int fi数组长度 * @return int整型 */ int smartSum(int number, int* si, int siLen, int* fi, int fiLen) { // write code here vector<pair<int,int>> a, b; a.push_back({0, 0}); for(int i = 0; i < number; ++i){ int sz = a.size(); for(int j = 0; j < sz; ++j) a.push_back({a[j].first+si[i], a[j].second+fi[i]}); sort(a.begin(), a.end()); for(int j = 0; j < a.size(); ++j){ while(!b.empty() && b.back().second <= a[j].second) b.pop_back(); b.push_back(a[j]); } swap(a, b); b.clear(); } int ans = 0; for(int i = 0; i < a.size(); ++i) if(a[i].first >= 0 && a[i].second >= 0) ans = max(ans, a[i].first + a[i].second); return ans; } };