P6956 [NEERC2017]Easy Quest 题解
刚学会用 \(\text{map}\),发篇题解记录一下。
题意:
- 当 \(a_i\) 为正数时,提供一个为 \(a_i\) 的魔法物品。
- 当 \(a_i\) 为负数时,消耗一个为 \(-a_i\) 的魔法物品。
- 当 \(a_i\) 为 \(0\) 时,提供一个任意的魔法物品。
解法:
- 开一个 \(\text{map}\) 存储现在还剩多少值为 \(a_i\) 的魔法物品。
- 如果 \(a_i > 0\),直接记录进 \(\text{map}\)。
- 如果 \(a_i < 0\),分情况讨论:
- 如果现在有这个魔法物品,则 \(\text{map}\) 中记录的数量 \(-1\);
- 如果现在没有有这个魔法物品,但有万能的魔法物品 \((a_i=0)\),则消耗一个万能的,同时把 \(-a_i\) 记录进数组里,计数器 \(+1\);
- 如果都没有,输出 \(\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;
}
以下是博客签名,正文无关
本文来自博客园,作者:Wy_x,转载请在文首注明原文链接:https://www.cnblogs.com/Wy-x/articles/18704587
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC-BY-NC-SA 4.0 协议)进行许可。

浙公网安备 33010602011771号