1 条题解

  • 0
    @ 2025-8-24 22:25:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Up_Xu
    **

    搬运于2025-08-24 22:25:26,当前版本为作者最后更新于2023-08-25 16:32:47,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    aia_i 为正数,提供一个价值为 aia_i 的物品。

    aia_i 为负数,消耗一个价值为 aia_i 的物品。

    aia_i00,选择一个价值随意的物品。

    要求判断所有 aia_i 为负数时的操作能否完成。

    思路

    很简单,开桶来记录每次的提供与消耗。但是,aia_i00 时选择的物品会影响到后面 aia_i 为负数的情况。那么我们就可以换种思路:在 aia_i00 时先不取物品,到后面 aia_i 为负数时,价值为 aia_i 的物品不够了,我们再拿前面 aia_i00 时的操作来补救。本题就轻松解决了。

    陷阱

    有可能出现价值随意的物品多余的情况,随意输出即可,本蒟蒻输出的是 10001000

    代码

    #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
    上传者