2 条题解

  • 3
    @ 2025-10-18 19:04:06

    来看到比赛题第一步,咱们先~兴~奋

    题目要求一只怪兽只能杀掉防御力低于自身攻击力的其他怪兽且只能杀掉一个,且我们要使剩余怪兽数量最少;

    那我们只需要排个序,这里以升序排列为例,让后面的怪兽去杀前面的怪兽,这样就可以只关注一直怪兽能否攻击而不去看他在攻击之前有没有死掉并保证所求为最优解;

    那么分两种情况,攻击力相等(不能杀),或后面的怪兽攻击力大于前面怪兽的攻击力(可以杀);

    当后面怪兽的怪兽攻击力不够时,我们只需要跳过该怪兽,让接下来的怪兽去攻击就可以了。否则可以杀,所剩怪兽数量累减,或所杀怪兽数量累加,完成攻击后跳过前面被杀的怪兽和该怪兽即可;

    if(r[x]==r[y]) y++;
    else ans--,x++,y++;
    

    实际上,无论是否攻击成功,后面的怪兽都需要跳过,它既然杀不掉当前防御力最小的,那它也就不能杀掉任何怪兽,因此我们只需要一个变量来存储当前防御力最小的怪兽而不需要特意存储用来攻击的怪兽,把这只怪兽作为循环变量即可;

    下面是代码部分

    
    #include <bits/stdc++.h>
    #define int long long
    const int N = 100005;
    using namespace std;
    
    int n,r[N],x=1,ans;
    
    signed main() {
    	cin>>n;
    	ans=n;
    	for(int i=1;i<=n;i++)
        cin>>r[i];
    	sort(r+1,r+n+1);
    	for(int y=1;y<=n;y++){
    		if(r[x]==r[y])continue;
    		else{
    			ans--;
    			x++;
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    

    时间复杂度为O(n),1e5明显能过

    “第二步,这道题直接5s解决”

    “第三步,太爽了(标椎河间口音)”

    • @ 2025-10-18 19:27:24

      遇事不决,激动解决

信息

ID
15
时间
1000ms
内存
256MiB
难度
9
标签
递交数
10
已通过
5
上传者