题解 | #容器盛水问题#

容器盛水问题

http://www.nowcoder.com/practice/f92929ec6e5642a690e7c197b0c40e38

特别需要注意数据的输入输出的范围,确定合适的数据类型,不然会溢出
注意sum+=width*height; 以及sum需要定义为long型

#include<stack>
using namespace std;

int main(){
    int n;
    scanf("%d", &n);
    int nums[n];
    for(int i=0;i<n;i++){
        scanf("%d", &nums[i]);
    }
    long sum=0;
    //单调递减序列
    stack<int>stk;
    
     for(int i=0;i<n;i++){
         while(!stk.empty() && nums[i]>nums[stk.top()]){
             int cur=stk.top();
             stk.pop();
//              if(stk.size()) sum += 1l*(i-stk.top()-1)*(min(nums[stk.top()],nums[i])-nums[cur]);
             if(stk.empty()){
                 continue; //左边没有比当前柱子高的,盛不了水
             }
             int left=stk.top();
             int right=i;
             long width=right-left-1;
             long height=min(nums[left], nums[right])-nums[cur];
             sum+=width*height;
         }
         stk.push(i);
     }
     //剩下的找不到右边更高的柱子,所以也积不了水,不用出栈了
    printf("%ld\n", sum);
    return 0;
}

全部评论

相关推荐

03-06 20:09
贵州大学 Java
King987:你这个学历找个中大厂刷实习经历都是可以的,但是项目要有亮点才行,这个什么外卖就不要做了,去找找最新的项目,至少涉及高并发或者是新型的AI技术mcp rag啥的 ,我在出简历点评,但是你这个没什么好点评的,内容太少,而且含金量太低。自己改一改吧,或者看一下我的项目地址中,那里有大厂最近做过的实习项目
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务