混战世界 百度秋招笔试【贪心】

混战世界
【题目描述】

战乱年代,整个世界各个军阀的兵团混战,你是PZ军团的战略参谋,你手下有n(保证为3的倍数)个士兵,第 i 个士兵的物理攻击数值为 Ai ,魔法攻击数值为 Bi ,你需要将这些士兵三等分为三个连,第一个连需要去物理空间参加物理对抗战争,战斗力估值 W1 为士兵的物理攻击数值之和;第二个连需要去魔法空间参见魔法战争,战斗力估值 W2 为士兵的魔法攻击数值之和;第三个连需要去虚幻空间参见物理魔法兼备的综合对抗战争,战斗力估值 W3 为所有士兵的物理攻击、魔法攻击数值之和除以2。你希望 w1+w2+w3 最大,这样才最有可能胜利。

输入描述:
第一行一个整数n,保证为3的倍数。(3<=n<=100000)第二行n个整数,第i个数表示Ai。第三行n个整数,第i个数表示Bi。(1<=Ai,Bi<=1000)

输出描述:
一个小数,表示最大数值之和,保留两位小数(四舍五入)。

输入样例:
6
1 7 3 4 5 9
2 3 9 4 3 3

输出样例:
35.00



题解:
一个人的物理攻击为A,魔法攻击为B。
派去一连的贡献为A,派去二连的贡献为B,三连为(A+B)/2。
这样去一连与三连差了(A-B)/2, 同理三连与二连差了(A-B)/2。
所以我们可以按(A-B)排序,较大的去一连,较小的去二连,中间的去三连。


代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=110000;
int n;
struct Node
{
  int a,b;
  int sum;
}solder[N];
bool cmp(Node x,Node y)
{
  return x.a-x.b>y.a-y.b;
}
int main()
{
  scanf("%d",&n);
  for(int i=0;i<n;i++)
  {
    scanf("%d",&solder[i].a);
  }
  for(int i=0;i<n;i++)
  {
    scanf("%d",&solder[i].b);
  }
  sort(solder,solder+n,cmp);
  int k=n/3;
  double ans=0;
  for(int i=0;i<n;i++)
  {
    if(i<k)
    {
      ans+=solder[i].a;
    }
    else if(i<2*k)
    {
      ans+=(solder[i].a+solder[i].b)*1.0/2.0;
    }
    else
      ans+=solder[i].b;
  }
  printf("%.2f\n",ans);
  return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值