1 条题解
-
0
自动搬运
来自洛谷,原作者为

Up_Xu
**搬运于
2025-08-24 22:25:26,当前版本为作者最后更新于2023-08-25 16:32:47,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意
若 为正数,提供一个价值为 的物品。
若 为负数,消耗一个价值为 的物品。
若 为 ,选择一个价值随意的物品。
要求判断所有 为负数时的操作能否完成。
思路
很简单,开桶来记录每次的提供与消耗。但是, 为 时选择的物品会影响到后面 为负数的情况。那么我们就可以换种思路:在 为 时先不取物品,到后面 为负数时,价值为 的物品不够了,我们再拿前面 为 时的操作来补救。本题就轻松解决了。
陷阱
有可能出现价值随意的物品多余的情况,随意输出即可,本蒟蒻输出的是 。
代码
#include<bits/stdc++.h> using namespace std; int n,t,i,x,sum,f[1010],a[1010]; int main(){ cin>>n; for(i=1;i<=n;i++){ cin>>x; if(x>0)f[x]++;//为正数时价值为x的物品数量加一 else if(x<0){ if(f[-x]>0)f[-x]--;//数量足够,就消耗掉一个 else{ if(sum>0)a[++t]=-x,sum--;//拿前面价值随意的物品来补救 else{cout<<"No";return 0;}//救不了输出No } } else sum++;//价值随意的物品个数加一 } cout<<"Yes\n"; for(i=1;i<=t;i++) cout<<a[i]<<" "; while(sum>0)cout<<"1000 ",sum--; }
- 1
信息
- ID
- 6115
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者