题目描述:
给出两只队伍投球距离,计算最优的三分线划分,使得:
队伍一的得分减去队伍二的得分尽可能大,如果存在相同的解,取队伍一得分最大的解
思路:
将两个队伍的头球距离放在同一个坐标轴上,枚举每一个投球距离作为三分线(小于等于该距离为两分,upper_bound()返回大于该值的第一个值的位置(注意可能返回越界值)),判断最优解
#include<iostream> #include<vector> #include<algorithm> using namespace std; int n,m; int a,b; vector<int> tf,ts; void judge(vector<int> &tx){ for(int i=0;i<n;i++){ int val1 = upper_bound(tf.begin(),tf.end(),tx[i])-tf.begin(); val1 = val1*2 + (n-val1)*3; int val2 = upper_bound(ts.begin(),ts.end(),tx[i]) - ts.begin(); val2 = val2*2 + (m - val2)*3; if(val1 - val2 == (a - b)){ if(val1 >a){ a = val1; b = val2; } } else if(val1 - val2 > a-b ){ a = val1; b = val2; } } } int main() { cin>>n; tf.resize(n); for(int i=0;i<n;i++){ cin>>tf[i]; } cin>>m; ts.resize(m); for(int i=0;i<m;i++){ cin>>ts[i]; } sort(tf.begin(),tf.end()); sort(ts.begin(),ts.end()); if(n>=m) { a = n*3 ; b = m*3 ; } else{ a = n*2 ; b = m*2 ; } judge(tf); judge(ts); printf("%d:%d",a,b); return 0; }