题目描述
小埋最近在玩一个打怪兽的游戏。游戏的内容是这样子的,有 nn 个怪兽部落,每个部落都有 aiai 数量的怪兽。我们的目标就是把所有怪兽部落的怪兽全部消灭。我们有两种游戏操作和一个魔法器具 xx,魔法器具初始魔法值为00。
我们可以选择在 11 ~ nn 部落中,任意一个部落有大于等于 11 的怪兽,我们可以选择消灭一个怪兽,并且能够让魔法器法力值加 11 。
我们可以选择使用魔法器,前提是 11 ~ nn 部落中现存有小于等于 xx 个怪兽的部落,我们可以使用魔法器消灭该部落中的所有怪兽,然后魔法器法力归 00 。
我们的目标是消灭所有部落中的所有怪兽,并且我们使用的操作数最少。
输入格式
第一行输入一个整数 tt (1<=t<=104)(1<=t<=104),代表测试的样例数量。
对于每组测试样例有两行。
第一行输入一个整数 nn (1<=n<=2∗105)(1<=n<=2∗105),代表怪兽的部落数量。
第二行是 nn 个怪兽部落每个部落的怪兽数量 a1,a2,...,ana1,a2,...,an (1<=ai<=109)(1<=ai<=109)。
对于所有的样例 nn 的总和不会超过 2∗1052∗105
输出格式
对于每个样例我们输出一个打怪兽的最小操作数。
样例
Input 1
4
4
1 3 1 1
4
1 2 1 1
6
3 2 1 5 2 4
2
1 6
Output 1
4
4
11
5
数据范围
None
我的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long n,a[200005];
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+1,a+n+1);
long long ans=0,s=0;
for(int i=1,j=n;i<=j;i++)
{
if(s<a[j])
{
ans+=a[i];
s+=a[i];
}
if(s>=a[j])
{
ans++;
s=0;
j--;
}
}
if(s>1)
{
ans-=s/2;
ans++;
}
printf("%lld\n",ans);
}
}
这个样例不管怎么调都不对,请各位大佬看看是什么问题