小小程序媛  
得之坦然,失之淡然,顺其自然,争其必然

题目

题目大意叙述如下:

现有 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;
}
posted on 2015-09-17 08:57  Coding菌  阅读(127)  评论(0编辑  收藏  举报