题目描述
牛牛逐渐成长,战斗力也渐渐增加,并可以指挥若干个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; }
提示:
做题一定要仔细,不然样例过了,但答案不过,可能就是因为不小心。
欢迎大家来讨论,作者会积极回复,最后别忘记 给作者点个赞哦。