每日OJ_牛客_AOE还是单体?_贪心_C++_Java
目录
牛客_AOE还是单体?_贪心
题目解析
C++代码
Java代码
牛客_AOE还是单体?_贪心
AOE还是单体?
描述:
牛可乐准备和 n 个怪物厮杀。已知第:个怪物的血量为 ai。牛可乐有两个技能:
第一个技能是蛮牛冲撞,消耗1 mp,可以对任意单体怪物造成 1点伤害。
第二个技能是蛮牛践踏,消耗 xmp ,可以对全体怪物造成 1 点伤害。
牛可乐想知道,将这些怪物全部击杀,消耗 mp 的最小值的多少?
输入描述:
第一行两个正整数 n 和 ,分别代表怪物的数量、每次蛮牛践踏消耗的 mp 值。
第二行 n 个正整数 a;,分别代表每个怪物的血量。
(1≤n< 200000,1≤x≤10°)
(1 ≤ai < 10°)
输出描述:
一个正整数,代表消耗mp的最小值。
题目解析
小贪心:
- 如果使用一次 AOE 造成的伤害比消耗的蓝量多,那就使用。
- 否则就一直使用单体伤害。
C++代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{int n = 0, x = 0;cin >> n >> x;vector<int> arr(n + 1);for(int i = 1; i <= n; ++i){cin >> arr[i];}sort(arr.begin(), arr.end());int index = max(0, n - x); // 处理 x 过⼤的情况long long ret = arr[index] * x;for(int i = index + 1; i <= n; ++i){ret += arr[i] - arr[index];}cout << ret;return 0;
}
Java代码
import java.util.*;
public class Main
{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt(), x = in.nextInt();int[] arr = new int[n];for(int i = 0; i < n; i++){arr[i] = in.nextInt();}Arrays.sort(arr);long ret = 0;int index = n - 1 - x;if(index < 0){for(int i = 0; i < n; i++) ret += arr[i];}else{ret += arr[index] * x;for(int i = index + 1; i < n; i++){ret += arr[i] - arr[index];}}System.out.println(ret);}
}