思路简单且没有发现重复做法的,没有那么多思维难度,但是代码很长。附上 AC 代码↓
#include<bits/stdc++.h>
using namespace std;
struct mon{
int rest;
int amount;
}monster[100005];
int maxn=-1,cnt=0,m,rest_all,b[100005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
b[m]++;//计数
if(m>maxn){//最大的数
maxn=m;
}
}
for(int i=1;i<=maxn;i++){
if(b[i]>=1){//当有数据时
monster[++cnt].amount=b[i];//存入方便使用
monster[cnt].rest=b[i];//剩余攻击力
//模拟战斗↓
if(monster[cnt].rest>=monster[cnt-1].amount){//情况1完全清除
monster[cnt].rest-=monster[cnt-1].amount;//剩余的攻击次数
n-=monster[cnt-1].amount;
if(monster[cnt].rest>0&&rest_all>0){//有需要消灭前面剩余时候
if(monster[cnt].rest>rest_all){
n-=rest_all;
rest_all=0;//全部消灭
}
else{
n-=monster[cnt].rest;
rest_all-=monster[cnt].rest;//未完全消灭
}
}
}
else{//情况2有剩余
monster[cnt-1].amount-=monster[cnt].rest;//剩余数量
n-=monster[cnt].rest;
rest_all+=monster[cnt-1].amount;//更新剩余总数量
}
}
}
cout<<n<<endl;
return 0;
}