题目:
解题思路:
依照题意最直接的解法会超时。改进的方案是使用一个nex数组记录水会流向的下一个未满的碟子。如2满3未满,则向1倒水时,倒满1之后直接跳到3.
ac代码:
#include <iostream>
using namespace std;
int a[200000];
int b[200000];
int nex[200000];
int n;
int add(int p,int x){
if(n==p) return n;
b[p]+=x;
if(b[p]>a[p]){
int remain=b[p]-a[p];
b[p]=a[p];
return nex[p]=add(nex[p],remain);
}
else{
return p;
}
}
int main(){
int m;
int flag;
int p,x,k;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=0;
nex[i]=i+1;
}
cin>>m;
for(int i=0;i<m;i++){
cin>>flag;
if(flag==1){
cin>>p>>x;
p--;
add(p,x);
}
else{
cin>>k;
cout<<b[k-1]<<endl;
}
}
}