题目描述
节日到啦,牛牛和妞妞邀请了好多客人来家里做客。
他们摆出了一座高高的香槟塔,牛牛负责听妞妞指挥,往香槟塔里倒香槟。
香槟塔有个很优雅的视觉效果就是如果这一层的香槟满了,就会从边缘处往下一层流去。
妞妞会发出两种指令,指令一是往第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成功了。