题目大意
第一只队伍有N的个人投篮,第二个人有M个人投篮,为了让第一只队伍和第二只队伍的分差尽可能大,怎么选定三分线
解题思路
对两只队伍的每个距离进行二分,判断最大分差,还有判断两只队伍都是投三分球和都是投二分球的进行判断
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 2e5+500;
const int INF = 0x3f3f3f3f;
int A[MAXN],B[MAXN],MAX = -1,MIN=-2,ans=-1;
int N,M;
int main()
{
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%d",&A[i]);
scanf("%d",&M);
for(int i=1;i<=M;i++) scanf("%d",&B[i]);
sort(A+1,A+N+1);sort(B+1,B+M+1);
MAX = N*3;
MIN = M*3;
if(2*N-M*2>MAX-MIN){
MAX = 2*N;
MIN = 2*M;
}
for(int i=1;i<=N;i++){
int p = upper_bound(A+1,A+N+1,A[i])-A-1;
int q = upper_bound(B+1,B+M+1,A[i])-B-1;
int tmp1 = p*2+(N-p)*3,tmp2=q*2+(M-q)*3;
if(tmp1-tmp2>MAX-MIN||(tmp1-tmp2==MAX-MIN && tmp1>MAX)){
MAX = tmp1;
MIN = tmp2;
}
}
//printf("[%d,%d]\n",MAX,MIN);
for(int i=1;i<=N;i++){
int p = upper_bound(A+1,A+N+1,B[i])-A-1;
int q = upper_bound(B+1,B+M+1,B[i])-B-1;
int tmp1 = p*2+(N-p)*3,tmp2=q*2+(M-q)*3;
if(tmp1-tmp2>MAX-MIN||(tmp1-tmp2==MAX-MIN && tmp1>MAX)){
MAX = tmp1;
MIN = tmp2;
}
}
printf("%d:%d\n",MAX,MIN);
}