题目描述

牛牛逐渐成长,战斗力也渐渐增加,并可以指挥若干个oier协同作战,给你一个数组a表示我方每个人的战斗力,再给你一个数组b,再给你一个数组c.

c[i]表示敌方b[i]战斗力的人有c[i]个
每个oier每次可以选择一名敌方人员进行战斗,如果战斗力大于等于敌方人员,就可以战胜,经验值+1
最开始的时候每个人的经验值都是0.
现在牛牛想要打败所有敌方人员,也就是说每个敌方人员都要被一个oier所打败,但是牛牛想要最小化最大的经验值,如果不能打败所有的敌方人员,输出-1
否则输出最小化最大的经验值.

输入描述:
第一行输入一个整数n表示我方人员的数量(1 ≤ n ≤ 50)
第二行输入 n个整数ai表示我方每个人员的战斗力(1 ≤ ai ≤ 10000)
第三行输入一个整数m表示b数组的长度(1 ≤ m ≤ 50)
第四行输入m个整数bi (1 ≤ bi ≤ 10000)
第五行输入m个整数ci (1 ≤ ci ≤ 1014)

输出描述:
输出一个整数

题目分析:
先按照题目将已知条件输入,将我方数组进行排序,再将结构体按照敌方战斗力从小到大排序。

由已知得:如果敌方战斗力最大值比己方战斗力最大值还大,那么可直接判断,输出-1即可。

反之,则要进行求最大平均值的过程。

该过程要从敌方最大的开始,因为从最大的开始我方比其小的数是分不到经验值的。

该题的解题关键是平均经验值,从敌方最大值开始,选出我方比其大的值(用lower_bound)进行平均敌方经验,如果是不可以平分,最大经验值肯定比求出平均数加1.如果可以平分则进行平分就可以了。

进行for循环,依此找出最大经验值,因为是从最大的开始,所以后面的是如果比前面的最大经验值小的话,是无法平分经验的。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct difang
{
    int b;
    long long c;
}d[55];
bool cmp (difang x,difang y)
{
    return x.b<y.b;
}
int main ()
{
    int a[55];
    int n,m;
    cin >> n;
    for (int i=1;i<=n;i++)cin >> a[i];
    cin >> m;
    for (int i=1;i<=m;i++)cin >> d[i].b;
    for (int i=1;i<=m;i++)cin >> d[i].c;
    sort (a+1,a+1+n);
    sort (d+1,d+1+m,cmp);

    long long sum=0,s,best=-1;
    if( a[n] < d[m].b ) cout << "-1" << endl;
    else 
    {
        for (int i=m;i>=1;i--)
        {
            sum=sum+d[i].c;
            s=n+1-(lower_bound(a+1,a+1+n,d[i].b)-a);
            if(sum%s==0)
            {
                best = max(best,sum/s);
            }
            else 
            {
                best = max(best,(sum/s+1));
            }
        }
        cout << best << endl;
    }

return 0;
}

提示:
做题一定要仔细,不然样例过了,但答案不过,可能就是因为不小心。

欢迎大家来讨论,作者会积极回复,最后别忘记 给作者点个赞哦。