混战世界(14)

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;
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值