1 问题
(牛客网百度2019秋招笔试题)
1.1 题目描述
一共有n个小兵(3的倍数),第i个小兵的物理攻击为Ai,魔法攻击为Bi,将这些小兵平均分为三个队,一队参加物理伤害抗战(伤害之和W1为该队所有小兵的物伤之和),二队参加魔法抗战(伤害之和W2为该队所有小兵的法伤之和),三队参加混合战(伤害之和W3为该队所有小兵的物伤和法伤之和除以2),问怎样分配,使得W1+W2+W3之和最大。
1.2 输入示例
第1行正整数n为小兵个数,第2行为每个小兵的物伤,第3行为每个小兵的法伤。
6
1 7 3 4 5 9
2 3 9 4 3 3
1.3 输出示例
保留两位小数(四舍五入)
35.00
2 问题分析
等价于英雄联盟,英雄联盟里面有n个英雄,有物理伤害,有魔法伤害,平均分成三队,使得总伤害最高。对于一个英雄,如果物理伤害远大于魔法伤害,适合当ADC,如果魔法伤害远大于物理伤害,适合当法师,如果物理伤害和魔法伤害接近,则适合当混合输出。对于一个英雄,物伤为A,法伤为B,若(A-B)越大,越适合当ADC,然后按照(A-B)进行排序。
3 代码
#include <iostream>
#include <algorithm>
using namespace std;
struct xiaobing {
int ad; //物理伤害
int ap; //魔法伤害
};
/*
6
1 7 3 4 5 9
2 3 9 4 3 3
*/
bool cmp(xiaobing x, xiaobing y) {
return x.ad - x.ap > y.ad - y.ap;
}
void test() {
int n;
cin >> n;
xiaobing* arr = new xiaobing[n + 1];
for (int i = 1; i < n + 1; i++) {
cin >> arr[i].ad;
}
for (int i = 1; i < n + 1; i++) {
cin >> arr[i].ap;
}
sort(arr + 1, arr + n + 1, cmp);
int three1 = n / 3; //三等分的第一个点
int three2 = n / 3 * 2; //三等分的第二个点
double sum = 0; //伤害之和
for (int i = 1; i <= three1; i++) //物理队
sum += arr[i].ad;
for (int i = three1 + 1; i <= three2; i++) //混合队
sum += (arr[i].ad + arr[i].ap)/2.0;
for (int i = three2 + 1; i <= n; i++) //魔法队
sum += arr[i].ap;
printf("%.2lf\n", sum);
}
int main()
{
test();
return 0;
}