题目描述:

给出两只队伍投球距离,计算最优的三分线划分,使得:

队伍一的得分减去队伍二的得分尽可能大,如果存在相同的解,取队伍一得分最大的解

思路:

将两个队伍的头球距离放在同一个坐标轴上,枚举每一个投球距离作为三分线(小于等于该距离为两分,upper_bound()返回大于该值的第一个值的位置(注意可能返回越界值)),判断最优解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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;
}