P6956 [NEERC2017]Easy Quest 题解

题目传送门

刚学会用 \(\text{map}\),发篇题解记录一下。

题意:

  1. \(a_i\) 为正数时,提供一个为 \(a_i\) 的魔法物品。
  2. \(a_i\) 为负数时,消耗一个为 \(-a_i\) 的魔法物品。
  3. \(a_i\)\(0\) 时,提供一个任意的魔法物品。

解法:

  • 开一个 \(\text{map}\) 存储现在还剩多少值为 \(a_i\) 的魔法物品。
  • 如果 \(a_i > 0\),直接记录进 \(\text{map}\)
  • 如果 \(a_i < 0\),分情况讨论:
  1. 如果现在有这个魔法物品,则 \(\text{map}\) 中记录的数量 \(-1\)
  2. 如果现在没有有这个魔法物品,但有万能的魔法物品 \((a_i=0)\),则消耗一个万能的,同时把 \(-a_i\) 记录进数组里,计数器 \(+1\)
  3. 如果都没有,输出 \(\text{No}\),并结束程序。
  • 如果能活到最后,输出 \(\text{Yes}\),换行,再输出万能魔法物品换成了什么魔法物品。

代码:


#include<bits/stdc++.h>   //万能头文件  
#define reg register
#define int long long
using namespace std; 
map<int,int>mp;//开map
int a[10000001],tot,cnt,n,x;
//tot:存 a[0] 总数
//cnt:存万能魔法物品变为一般魔法物品的数量
//a:存万能魔法物品变为了什么魔法物品
//x:临时变量
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>x;
		if(x>0) mp[x]++;//大于 0,直接存入 map
		else if(x==0) tot++;//等于 0,a[0] 总数加一
		else
		{
			if(mp[-x]) mp[-x]--;//如果现在有这个魔法物品,计数器减一
			else
			{
				if(tot-cnt>0)//如果还有万能魔法物品,则改这个万能魔法物品为一般魔法物品,cnt+1
				{
					cnt++;
					a[cnt]=-x;
				}
				else//上面的条件都不满足,就挂了
				{
					cout<<"No"<<endl;
					return 0;
				}
			}
		}
	}
	cout<<"Yes\n";
	for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";
	for(int i=cnt+1;i<=tot;i++) cout<<"1 ";//以防万能魔法物品没有用完,输出 1
	cout<<endl;
	return 0;
}
posted @ 2025-02-08 16:41  Wy_x  阅读(18)  评论(0)    收藏  举报