PTA 大熊小熊掰玉米

有大小两头熊,找了一个好天气,相约各背着一个筐子去掰玉米。

熊会有以下两种动作:

  • 掰一个玉米棒子扔进自己的筐子
  • 嫌筐子太重,从自己的筐里拿出一个玉米棒子扔进另一头熊的筐子

注意:如果筐子满了,那么若再向它扔一个玉米棒子,这个玉米棒子将掉到地上。如果筐子是空的,那么从这个筐子里拿玉米,显然什么也拿不到。

假设每个玉米棒上的玉米粒数量都不会变化(不会被磕掉),请根据给定的两头熊掰玉米的过程,计算最终两头熊筐子里的玉米棒上的玉米粒数量。

p.s. 呃…… 大家见过玉米棒子吧? 为避免题意理解偏差,提供一张图片:

1.png


这张图片显示了3个玉米棒子,每个棒子上有若干粒玉米。

输入格式:

第一行给出两个不超过50的正整数,分别是大熊、小熊的筐子所能容纳玉米棒子的最大数量。(筐子的大小和熊的大小没有关联)
接下来有若干行:每行先给出一个范围是[-2,2]的整数C,并且:
C12,则在这一行再给出一个不超过1000的正整数m,表示大熊(C=1)或小熊(C=2)掰了一个有m粒玉米的棒子扔进自己的筐子,Cm之间以一个空格分隔。
C-1-2,则表示大熊(C=-1)或小熊(C=-2)从自己的筐子拿一个玉米棒扔到另一头熊的筐子里。
C0,表示掰玉米过程结束,这是最后一行输入。

注意,每行输入的末尾是有换行符的。

输出格式:

在一行中输出掰玉米结束后,大熊和小熊各自筐子里玉米棒子上的玉米粒总数量,中间以一个空格分隔,行末有换行符。

输入样例:

4 5
1 1
1 2
-1
2 4
-1
2 8
-1
1 16
1 32
2 64
-1
1 128
2 256
-2
0

输出样例:

208 15

解题思路:主要思路是使用两个栈分别表示大熊和小熊的筐子。根据输入的指令进行相应的操作。如果是1或2,则将玉米棒子扔进自己的筐子,并且自己的筐子还没满。如果是-1或-2,则将一个玉米棒子从自己的筐子拿出来扔进另一头熊的筐子里,并且另一头熊的筐子还没满如果满了也把自己筐子里的丢掉。最后,计算大熊和小熊筐子里玉米棒上的玉米粒总数量,并输出。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int xd,xe; // 大熊和小熊筐子的最大容量
    cin>>xd>>xe;
    stack<int> xa; // 大熊的筐子
    stack<int> xb; // 小熊的筐子
    int c,m;
    while(cin>>c){
        if(c==0)break; // 输入为0时,掰玉米过程结束
        if(c==1){ // 大熊掰一个玉米棒子扔进自己的筐子
            cin>>m;
            if(xa.size()<xd) // 如果大熊的筐子还没满
                xa.push(m);
        }
        if(c==2){ // 小熊掰一个玉米棒子扔进自己的筐子
            cin>>m;
            if(xb.size()<xe) // 如果小熊的筐子还没满
                xb.push(m);
        }
        if(c==-1 &&xa.size()>0){ // 大熊从自己的筐子拿一个玉米棒扔到小熊的筐子里
            if(xb.size()<xe) // 如果小熊的筐子还没满
                xb.push(xa.top());
            xa.pop();
        }
        if(c==-2 && xb.size()>0 ){ // 小熊从自己的筐子拿一个玉米棒扔到大熊的筐子里
            if(xa.size()<xd) // 如果大熊的筐子还没满
                xa.push(xb.top());
            xb.pop();
        }
    }
    int sum1=0,sum2=0; // 大熊和小熊筐子里玉米棒上的玉米粒总数量
    while(!xa.empty()){
        sum1+=xa.top();
        xa.pop();
    }
    while(!xb.empty()){
        sum2+=xb.top();
        xb.pop();
    }
    cout<<sum1<<" "<<sum2<<endl;
    return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值