杀小怪 (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;
}
如果有不懂得可以在评论区讨论!!