题目:Birthday Gift
来源:第三届中国计量大学ACM程序设计竞赛个人赛(同步赛)
解题思路
有 个球,每个球有两个属性值 和 。
随机选择两个球 和 ,其美丽值定义为 。
求美丽值的最大值。
对 个球按照 属性值从大到小的顺序排序。
确定球 ,遍历其后的球 ,则 是递减的,一旦其值不大于当前的最大美丽值,就可跳出循环。
C++代码
#include<iostream> #include<vector> #include<algorithm> using namespace std; bool comp(vector<int>& v1, vector<int>& v2){ return v1[0] > v2[0]; } int main(){ int n; cin >> n; vector<vector<int>> balls(n, vector<int>(2)); for(int i=0; i<n; ++i) cin >> balls[i][0]; for(int i=0; i<n; ++i) cin >> balls[i][1]; sort(balls.begin(), balls.end(), comp); int ans = 0; for(int i=0; i<n; ++i){ for(int j=i+1; j<n; ++j){ int b1 = balls[i][0] + balls[j][1]; int b2 = balls[i][1] + balls[j][0]; if(b2 <= ans) break; ans = max(ans, min(b1, b2)); } } cout << ans << endl; return 0; }