zoukankan      html  css  js  c++  java
  • Codeforces 948C Producing Snow(优先队列+思维)

    题目链接:http://codeforces.com/contest/948/problem/C

    题目大意:给定长度n(n<=1e5),第一行v[i]表示表示第i堆雪的体积,第二行t[i]表示第1~i天的雪将要消融的体积,一堆雪如果消融到体积为0则消失,求每天消融的雪的体积。

    解题思路:用优先队列,第i天就将v[i]+sum[i-1]放入优先队列中,然后初始消融量ans=t[i]*q.size(),假设每堆雪都够消融,然后根据优先队列找到q.top()<=sum[i]即不够消融的,减掉差值。

    代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<cstring>
     5 #include<functional>
     6 #include<algorithm>
     7 using namespace std;
     8 typedef long long LL;
     9 const int N=1e5+5;
    10 
    11 LL t[N],sum[N],v[N];                             //sum[i]是t[i]的前缀和
    12 
    13 int main(){
    14     priority_queue<LL,vector<LL>,greater<LL> >q;
    15     int n,m;
    16     scanf("%d",&n);
    17     for(int i=1;i<=n;i++){
    18         scanf("%lld",&v[i]);
    19 
    20     }
    21     for(int i=1;i<=n;i++){
    22         scanf("%lld",&t[i]);
    23         sum[i]=t[i]+sum[i-1];
    24     }
    25     for(int i=1;i<=n;i++){
    26         q.push(v[i]+sum[i-1]);                  //加上sum[i-1],可以在减的时候将前一段没有消融的sum[i-1]抵消掉
    27         LL ans=t[i]*q.size();                   //先假设没有一堆雪不够消融t[i]
    28         while(!q.empty()&&q.top()<=sum[i]){     //找到不够t[i]的,减掉差值(不够的部分)
    29             ans+=q.top()-sum[i];
    30             q.pop();
    31         }
    32         printf("%lld%c",ans,i==n?'
    ':' ');
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    java第四次作业
    JAVA第三次作业
    Java第二次作业
    Java第一次作业
    android studio下载
    Android面试常问到的知识点
    [Java基础]List,Map集合总结
    搞ACM的你伤不起[转自RoBa]------(看一次,笑一次)
    06.5.1.Functions
    05.virsh命令的常用操作(kvm)
  • 原文地址:https://www.cnblogs.com/fu3638/p/8543875.html
Copyright © 2011-2022 走看看