杀小怪 (C++)

题目描述

莫妮卡正在玩一款电脑游戏,这个游戏中一共有n只小怪,每个怪物都有一个生命值,当生命值为0的时候,这个怪物就被杀死了。

莫妮卡每次可以执行两种操作中的一种:

1.选择两个怪物,扣掉他们一点血

2.直接将一个怪物生命值归零

现在莫妮卡希望用最少的次数杀掉所有的怪物,求这个操作次数是多少?


输入格式

第一行输入一个整数n (n<=10000)

第二行输入n个数字,代表n个怪物的生命值

输出格式

一个整数,代表最少操作次数


输入样例

4

1 2 1 2

输出样例

3


限制

时间限制:1000ms

内存限制:65536KB


说明/提示

每个数字不超过int类型


分析:

这题我们有两个策略

1.全部清除

2.一次减一点

那怎么样才能将其利益最大化?

以样例为例  1 2 1 2 ,1和1用第一种方案击败了,剩下的2和2可以用两次第一个方案,或各自用第二个方案,都只需要三次,那么我们可以总结出来经验,如果数字是1,统计1的个数,如果个数是偶数,答案加上数量/2的商,如果是奇数,答案加上数量/2+1。如果数字>=2,直接消除,答案+1。

代码不就出来了。


代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{	
	int n,x,num;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		if(x==1) num++;
	}
	cout<<(num+1)/2+(n-num);
    return 0;
}

如果有不懂得可以在评论区讨论!! 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值