原神 题解
题目大意
有一个魔法师,她可以用火元素攻击魔法把对附着冰元素的怪物的伤害 \(\times 2\),用冰元素攻击魔法把对附着火元素的怪物的伤害 \(+k\)。
每个怪物初始时没有附着任何元素,给出冰、火元素对每个怪物的初始伤害,魔法师可以任意安排攻击顺序,攻击后清空附着元素,求最大总伤害。
解题思路
首先把初始伤害加到总伤害中。
要求最大总伤害,所以把 \(a\) 数组从大到小排序,优先用最大的。
因为每个怪物初始时没有附着任何元素,所以要先给每个怪物附着元素。因为只有对附着着一种魔法的怪物打出另一种魔法才会产生更多的伤害,所以每个怪物要消耗两种不同的元素(附着一种,对其伤害一种),所以产生更多的伤害的元素攻击最多有 \(\min(n,m)\) 次。
枚举排好序的 \(a\) 序列。不管是 \(a_i + a_i\) 还是 \(b_i+k\),对后面都是没有影响的,所以直接选择 \(\max(a_i,k)\)。即:
\[\sum\limits_{i=1}^{\min(n,m)}\max(a_i,k)
\]
最后不要忘记要把初始伤害加上。
代码
#include<bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
ll n,m,k,ans=0;
ll a[1000005],b[1000005];
bool cmp(ll x,ll y){
return x>y;
}
int main() {
cin>>n>>m>>k;
for(ri i=1;i<=n;i++)cin>>a[i];
for(ri i=1;i<=m;i++)cin>>b[i];
for(ri i=1;i<=n;i++)ans+=a[i];
for(ri i=1;i<=m;i++)ans+=b[i];
sort(a+1,a+n+1,cmp);
int sum=min(n,m);
for(ri i=1;i<=sum;i++)
ans+=max(a[i],k);
cout<<ans;
return 0;
}