战乱年代,整个世界各个军阀的兵团混战,你是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;
}