2 条题解

  • 4
    @ 2026-8-14 15: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解决”

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

    • 4
      @ 2026-8-14 15:04:06

      构思搜狗把我快写完的题解吃了,气死我了,直接交AC代码

      (总感觉少点什么,多少还是写点吧)

      把每个攻防的数量存起来; 设now为数量最多的攻防,最小数量为s:

      比now小的攻防to会被to<=x<=now的击败,保证小于now的攻防会被全部击败,当前s=now;

      比now大的攻防没击败一个,即s--,但他本身会补上这个空缺,即s++,最终s不变;

      综上所述s=now;

      #include<bits/stdc++.h>
      #define int long long
      using namespace std;
      
      map<int ,int > dic;
      int n;
      int sum=0;
      
      signed main(){
      	ios::sync_with_stdio(0);
      	cin.tie(0); cout.tie(0);
      	
      	cin>>n;
      	int arr;
      	for(int i=1;i<=n;i++){
      		cin >> arr;;
      		dic[arr]++;
      	}
      	
      	for(auto it=dic.begin();it!=dic.end();it++){
      		if((*it).second>=sum)sum=(*it).second;
      	}
      	
      	cout<<sum;
      	return 0;
      }
      
      • 1

      信息

      ID
      1064
      提交时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      2
      已通过
      2
      上传者