其实刚开始看到这道题,应该很多都会想到区间DP中的合并石子,开一个2倍的空间(严格来说的话应该是2n-1),将本来的环变成一个链式的结构。然后对于得到的消息,可以预处理一个前缀和,这样就可以很方便的知道 1~k-1 中是否会有 <0 的情况,那么这样就可以很容易得到第一种做法(这里的前缀和我写的有点麻烦,大佬们谅解一下)

  1. //暴力
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int n;
  5. int a[2000005];
  6. int sum[2000005];
  7. bool check(int now){
  8. for(int j=0;j<n;j++){
  9. if(sum[now+j]-sum[now-1]<0) return false;
  10. }
  11. return true;
  12. }
  13. int main(){
  14. scanf("%d",&n);
  15. for(register int i=1;i<=n;i++){
  16. scanf("%d",&a[i]);
  17. a[i+n]=a[i];
  18. sum[i]=sum[i-1]+a[i];
  19. }
  20. int tot=1;
  21. for(register int i=n+1;i<=2*n-1;i++){
  22. sum[i]=sum[i-1]+a[tot];
  23. tot++;
  24. }
  25. int ans=0;
  26. for(register int i=1;i<=n;i++){
  27. if(check(i)==true) ans++;
  28. }
  29. cout<<ans;
  30. return 0;
  31. }

看着感觉不能过,毕竟有点暴力的思想在里面,但是居然得了75分,我然后就想着快读+吸氧看能不能直接过,但事实上还是TLE了两个点,那么我们重新回到样例看一看

当我们将这个环形链化,并且处理前缀和之后,我们可以得到以下的数据

  1. -3 5 1 2 -3 5 1
  2. -3 2 3 5 2 7 8

那么对于每n个长度(即每一种不同的k的情况),我们可以得到分别的前缀和

  1. -3 5 1 2 //不同k的情况
  2. -3 2 3 5 //前缀和
  3. 5 1 2 -3
  4. 5 6 8 5
  5. 1 2 -3 5
  6. 1 3 0 5
  7. 2 -3 5 1
  8. 2 -1 4 5

我们再进一步处理,得到每一组情况的最小前缀和分别为-3 5 0 -1,那么对于这其中大于等于0的情况的总数,就是最后答案的解了。所以这道题的思路,就是用单调队列维护区间的最小前缀和。至于单调队列,大家可以去搜搜滑动窗口,是单调队列的模板题

  1. //单调队列
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int n;
  5. int a[2000005];
  6. int sum[2000005];
  7. deque<int> q;
  8. int main() {
  9. scanf("%d",&n);
  10. for(register int i=1; i<=n; i++) {
  11. scanf("%d",&a[i]);
  12. a[i+n]=a[i]; //化环为链,因为方便写,这里实际是存储了2n个数据的
  13. sum[i]=sum[i-1]+a[i]; //处理前n个前缀和
  14. }
  15. int tot=1; //方便记录之后的前缀和
  16. for(register int i=n+1; i<=2*n-1; i++) {
  17. sum[i]=sum[i-1]+a[tot];
  18. tot++; //处理n到2n-1个前缀和
  19. } //这里的前缀和处理可以其实直接写成一个for循环的,但是写的有些麻烦
  20. int ans=0;
  21. for(register int i=1; i<=2*n-1; i++) {
  22. while(!q.empty()&&sum[q.back()]>=sum[i]) q.pop_back(); //维护最小前缀和
  23. q.push_back(i);
  24. if(i>=n) { //一定是长度为n的
  25. while(!q.empty()&&q.front()<=i-n) q.pop_front(); //保证答案是在当前区间范围内
  26. if(sum[q.front()]-sum[i-n]>=0) ans++; //最小前缀和
  27. }
  28. }
  29. printf("%d",ans);
  30. return 0;
  31. }

P2629 【好消息,坏消息】的更多相关文章

  1. 线段树【p2629】 好消息,坏消息

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p2629 好消息,坏消息 历程 刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \ ...

  2. 单调队列练习题解(切蛋糕&好消息,坏消息)

    单调队列的练习题解 前言: 在上一篇学习记录中,单调队列给出了几道练习题,因为这两道题的算法以及思路相差无几(几乎可以算是双倍经验quq),所以就在这里集中写一下相关的题解 前置知识: 见:队列专题( ...

  3. 洛谷 P2629 好消息,坏消息

    题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...

  4. 【洛谷】【前缀和+st表】P2629 好消息,坏消息

    [题目描述:] uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一 ...

  5. 洛谷【P2629】好消息,坏消息

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.luogu.org/problemnew/show/P2629 ...

  6. P2629 好消息,坏消息

    题目描述 uim在公司里面当秘书,现在有n条消息要告知老板.每条消息有一个好坏度,这会影响老板的心情.告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度.最开始老板的心情是0,一旦老板 ...

  7. 【P2629】好消息,坏消息(前缀和+单调队列优化DP)

    一激动一颓就会忘了总结... 前面的大黄题就不总结了. 这个题我只想说一声艹,一开始的思路就是正确的,然后计算的时候有了一个瑕疵,不过很快也就改过来了.然后却一直连样例都过不了.仔仔细细看了老半天,经 ...

  8. 洛谷 P2629 好消息,坏消息 题解

    暴力算法的时间复杂度是O(n^2),考虑优化: 先导入一种思想--断环为链.说通俗点就是在原数组后面再接上下标为1--(n - 1)的元素: 以样例为例:-3 5 1 2:我们将其断环为链后可以得到这 ...

  9. 坏消息:百度影音、快播关闭P2P服务器!

    继日前优酷土豆集团.搜狐视频.腾讯视频.乐视网.中国电影著作权协会(MPA).美国电影协会 (MPAA).日本内容产品流通海外促进机构(CODA).万达影业.光线传媒.乐视影业联合发布“中国网络视频反 ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法训练求先序排列

    问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入格式 两行,每行一个字符串,分别表示中序和后序排列 输出格式 一个字符串,表示所 ...

  2. Java实现 LeetCode 111 二叉树的最小深度

    111. 二叉树的最小深度 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...

  3. java实现风险度量

    X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网. 两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如果能找到一个站 ...

  4. Java实现 蓝桥杯 算法提高 道路和航路

    问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1-T),这些城镇通过R条标号为(1-R)的道路和P条标号为(1-P)的航路相连. 每一条公路i或者航路i表 ...

  5. 洛谷 P1115 最大子序和

    **原题链接** ##题目描述   给出一段序列,选出其中连续且非空的一段使得这段和最大.     **解法**:       1.暴力枚举 时间:O(n^3)       2.简单优化 时间:O(n ...

  6. 【JAVA习题三十】求0—7所能组成的奇数个数

    package erase; public class 求0到7所能组成的奇数个数 { public static void main(String[] args) { /* * 求0—7所能组成的奇 ...

  7. 深入浅出-TCP/IP协议族剖析&&Socket

    Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 #简介 该篇文章主要回顾–TCP/I ...

  8. PBFT共识算法

    拜占庭将军问题 我们已知的共识算法,Paxos.Raft解决的都是非拜占庭问题,也就是可以容忍节点故障,消息丢失.延时.乱序等,但节点不能有恶意节点.但如何在有恶意节点存在的情况下达成共识呢?BFT共 ...

  9. Hive中row_number()、dense_rank()、rank()的区别

    摘要 本文对Hive中常用的三个排序函数row_number().dense_rank().rank()的特性进行类比和总结,并通过笔者亲自动手写的一个小实验,直观展现这三个函数的特点. 三个排序函数 ...

  10. QToolTip 设置提示信息

    import sys from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt5.QtG ...