香槟塔C++

题目描述

节日到啦,牛牛和妞妞邀请了好多客人来家里做客。
他们摆出了一座高高的香槟塔,牛牛负责听妞妞指挥,往香槟塔里倒香槟。
香槟塔有个很优雅的视觉效果就是如果这一层的香槟满了,就会从边缘处往下一层流去。
妞妞会发出两种指令,指令一是往第x层塔内倒体积为v的香槟,指令二是询问第k层塔香槟的体积为多少。

告诉你香槟塔每层香槟塔的初始容量,你能帮牛牛快速回答妞妞的询问吗?

输入描述:

第一行为两个整数n,m。表示香槟塔的总层数和指令条数。
第二行为n个整数ai,表示每层香槟塔的初始容量。

第三行到第2+m行有两种输入,一种输入是“2 x v”表示往第x层倒入体积为v的香槟;另一种输入是“1 k”表示询问第k层当前有多少香槟。

1 <= n, m <= 1000。
1 <= n ,m <= 200000,1 <= ai ,v <= 1000000000。

输出描述:

对于每个询问,输出一个整数,表示第k层香槟的容量。

示例1

输入

1 2
8
2 1 9
1 1

输出

8

示例2

输入

5 4
1 2 2 10 1
1 3
2 2 5
2 4 3
1 4

输出

0
4

思路

先分析一下输入:

5 4 ,n=5,m=4,有五层的香槟塔,我们有四次机会采取倒香槟还是输出某一层的已经有的香槟数量

1 2 2 10 1,每层分别能装的香槟

以下是4次机会进行操作

1 3 ,第一个数=1,那么执行输出操作,输出第三层的香槟有几杯是满的

2 2 5 ,第一个数=2,那么执行倒香槟操作,向第二层倒五杯的量

2 4 3,第一个数=2,那么执行倒香槟操作,向第四层倒三杯的量

1 4,第一个数=1,那么执行输出操作,输出第三层的香槟有几杯是满的

香槟塔:

1 第一层

2

2

10

1 第五层

倒香槟的时候如果这一层的香槟满了,就会从边缘处往下一层流去。

1 3 ,输出第三层的香槟数,刚开始没倒,输出0

2 2 5 ,向第二层倒五杯的量,第二层满了会继续往下流到第三层第四层

那么香槟塔中

1 第一层

2,2

2,2

10,1

1 第五层

2 4 3,向第四层倒三杯的量,同理香槟塔中

1 第一层

2,2

2,2

10,1,3

1 第五层

1 4,输出第四层的香槟有几杯是满的,第四层=4

代码

#include<iostream>
using namespace std;
int qufan(int i)
{
    return (i+1)%2;
}
int main(){
    int i,j,n,m,k,count,sum,temp,ii,jj;
    cin>>n>>m;
    int volum[n],carry[n];
    int x,toLayer,tonum,rest;
    for(i=0;i<n;i++){//每层分别能装的酒
        cin>>volum[i];
        carry[i]=0;//carry存储每次已经倒香槟的情况
    }
    i=0;
 while(i<m){
     cin>>x;
     count=0;
       if(x==2)
       {
           cin>>toLayer>>tonum;
           toLayer--;
           while(tonum!=0&&toLayer<n){//如果香槟从第toLayer-1层还没分完且toLayer还没到最底层
               rest=volum[toLayer]-carry[toLayer];//本层的剩余空杯子还未装香槟的数量
           if(rest<=tonum)//tonum为本次要倒入的香槟
           { carry[toLayer]+=rest; count=rest;}
           else { carry[toLayer]+=tonum; count=tonum; }
           tonum-=count;
           toLayer++;
           }//while
       }
       else if(x==1)
       {
           cin>>tonum;
           cout<<carry[tonum-1]<<endl;
       }
       /* for(j=0;j<n;j++){
            cout<<carry[j]<<" ";}*/
            i++;
    }//while
return 0;}

 PS

看到讨论里边有人说这个while(i<m){}语句写成for会超时,实际上完全没差,写成for也AC成功了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值