牛客小白月赛25 AOE还是单体?

链接:https://ac.nowcoder.com/acm/contest/5600/A
来源:牛客网

题目描述
牛可乐准备和 个怪物厮杀。已知第 个怪物的血量为 aia_iai​ 。
牛可乐有两个技能:
第一个技能是蛮牛冲撞,消耗 ,可以对任意单体怪物造成 点伤害。
第二个技能是蛮牛践踏,消耗 ,可以对全体怪物造成 点伤害。
牛可乐想知道,将这些怪物全部击杀,消耗 的最小值的多少?
输入描述:

第一行两个正整数 和 ,分别代表怪物的数量、每次蛮牛践踏消耗的 值。
第二行 个正整数 aia_iai​ ,分别代表每个怪物的血量。

输出描述:

一个正整数,代表消耗 的最小值。

示例1
输入
复制

5 2
2 4 5 6 3

输出
复制

11

说明

先对3号怪物用1次蛮牛冲撞,对4号怪物用2次蛮牛冲撞,此时消耗mp为3,怪物的血量是2,4,4,4,3。
然后用4次蛮牛践踏,击杀全部怪物,消耗的mp总量为11。

显然题 :

  • 多次践踏后非零个数会小于践踏需要的mp

  • 当非0个数大于蛮牛践踏消耗的mp ( 即 c n t 非 零 > x ) (即cnt_{非零}>x) (cnt>x)时,使用践踏更优

  • 当非0个数小于x时,使用对每个怪物冲撞更优
    \

大到小排个序列
所以,只需要找前 x x x大的值,多次践踏把 [ x , n ] [x,n] [x,n]大消耗成0,
剩下的怪物全部用冲撞,非0数字累加即可

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN ((int)2e5+7)
#define ll long long int
#define int long long int
#define INF (0x7f7f7f7f)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \
do { \
	cout << "\033[31;1m " << #x << " -> "; \
	err(x); \
} while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

int n, m, Q, K, a[MAXN];

signed main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	//非0个数大于等于x就用践踏
	//如果x太大,就不用
	//找前x大的数
	//6-3, 5-3  mp=3*2 + 3+2 = 11
	scanf("%lld %lld ", &n, &K);
	int sum = 0;找前x大的数

	for(int i=1; i<=n; i++) 
		scanf("%lld ", a+i), sum += a[i];
	if(K > n) { //注意K>n的情况,用践踏不划算,所以全用冲撞
		printf("%lld\n", sum);
		return 0;
	}
	sort(a+1, a+1+n, greater<int>());
	int kth = a[K];
	int ans = K * kth;
	for(int i=1; i<K; i++)
		ans += (a[i] - kth);
	printf("%lld\n", ans);

#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值