申请添加题解
查看原帖
申请添加题解
577263
sea_bird楼主2024/10/30 13:19

模拟最优的战斗

思路简单且没有发现重复做法的,没有那么多思维难度,但是代码很长。附上 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;
}

2024/10/30 13:19
加载中...