网易互联网2015 在线笔试(2)

来源:互联网 发布:淘宝韩国直邮鉴别真假 编辑:程序博客网 时间:2024/05/21 20:28

题目

题目大意叙述如下:

现有 AB 两队进行篮球比赛,位置 d 为三分线,在三分线外进球则得 3 分,三分线内进球则得 2 分;

A 队整场进球 n 个,位置分别为 a1,a2,...an

B 队整场进球 m 个,位置分别为 b1,b2,...bm

主人公小明有权设立三分线位置,他想让 A 队尽可能多的得分,以拉大 AB 两队的得分差距。问将 d 设置为多少可以使得 Score(A)Score(B) 分差最大?

分析

此题要求 Score(A)Score(B) 的最大值,就要保证 A 队得分尽量高,也就是说要使得其三分球的数目尽可能的多。现在以 A 队投篮的位置为基准,将三分线设立为其从小到大的逐个位置,求分差,找到最大分差值,则该位置就是三分线设立点。

程序实现

#include <iostream>#include <cstdlib>#include <vector>#include <algorithm>using namespace std;int getCount(vector<int> &Bd, int m, int d){    int count = 0;    for (int i = 0; i < m; i++)    {        if (Bd[i] < d)            count++;    }    return count;}int maxScore(vector<int> &Ad, int n, vector<int> &Bd, int m){    //将AB两队的,投篮点排序    sort(Ad.begin(), Ad.end());    sort(Bd.begin(), Bd.end());    int max = 0 , dis = 0;    for (int i = 0; i < n; i++)    {        //将三分点设置为当前        int d = Ad[i];        //求A队得分        int scoreA = 3 * (n - i) + 2 * i;        //求B队得分        int num = getCount(Bd, m, d);        int scoreB = 2 * num + 3 * (m - num);        //求临时分差        int tmp = scoreA - scoreB;        if (tmp > max)        {            max = tmp;            dis = d;        }//if    }    return max;}int main(){    int n, m,tmp;    vector<int> Ad, Bd;    cin >> n;    for (int i = 0; i < n; i++)    {        cin >> tmp;        Ad.push_back(tmp);    }    cin >> m;    for (int i = 0; i < m; i++)    {        cin >> tmp;        Bd.push_back(tmp);    }    cout << maxScore(Ad, n, Bd, m) << endl;    system("pause");    return 0;}
0 0
原创粉丝点击