站外题求助,玄关
  • 板块灌水区
  • 楼主Chalage_2010
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/12/3 15:23
  • 上次更新2023/12/3 17:24:27
查看原帖
站外题求助,玄关
760690
Chalage_2010楼主2023/12/3 15:23
题目描述

小埋最近在玩一个打怪兽的游戏。游戏的内容是这样子的,有 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);
	}
}

这个样例不管怎么调都不对,请各位大佬看看是什么问题

2023/12/3 15:23
加载中...