それならゼロから、いや、ゼロから始めましょう

简介: それならゼロから、いや、ゼロから始めましょう

それならゼロから、いや、ゼロから始めましょう - NYOJ


思路:

       遍历:结局是一的就加到cnt中

       随后双指针枚举,快指针指向的元素是0则加到cnt,指针间距超过k,若慢指针所指的元素是


       0,则cnt减去这个元素,每一轮操作完要res= max;

       最后输出res+已经是1的结局契合值


流程:根据题目关键词连续区间来确定用的算法是双指针,考虑双指针的指针移动情况,写出特殊的条件,与数据维护的语句


套路:


1.用双指针滑动窗口就好了,(关键词:连续区间,序列)

此题右指针一直在移动,左指针满足某条件后移动

1. for(int i = 1,j = 1;i <= n;i++){
2. if(...)j++;
3. }

也有不满足某条件时,右指针移动,满足某条件时左指针移动

1. for(int i = 1,j = 1;i <= m;i++){
2. while(...)j++;
3. }

2.容易与双指针滑动窗口扯上关系的最值问题,在双指针前声明返回值res,有时还需要储存每一轮数据的cnt、ans,在数据变动后与res进行比较

#include <iostream>
using namespace std;
const int N = 1e7;
typedef long long ll;
int st[N],num[N];
int main(){
  int n,k;
  cin >> n >> k;
  for(int i = 0;i < n;i++){
    cin >> num[i];
  }
  for(int i = 0;i < n;i++){
    cin >> st[i];
  }
  int res = 0;
  for(int i = 0;i < n;i++){
    if(st[i] == true) res += num[i];
  }
//    cout << "res = " << res;
  int sum = 0,maxn = 0;
  for(int i = 0,j = 0;i < n;i++){
    if(st[i] == false) sum += num[i];
//        cout << "sum = " << sum <<" ";
    if(i - j + 1 > k){
      if(st[j] == false) sum -= num[j];
      j++;
    }
//        cout << "sum = " << sum <<" ";
    maxn = max(sum,maxn);
//        cout << "maxn = " << maxn << " ";
  }
  cout << maxn + res;
  return 0;
}

********************************

题解代码

或者是用i-k来代替慢指针

只需操控一个指针,比较方便

此题是i > k + 1 后,j始终会随着i移动,且差值始终为k,所以根本不需要双指针

双指针是i,j会根据情况来改变移动情况时用的

#include<iostream>
using namespace std;
const int N = 1e6;
int main(){
    bool st[N];
    int a[N];
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i = 1;i <= n;i++){
    cin >> a[i];
    }
    for(int i = 1;i <= n;i++){
        scanf("%d",&st[i]);
    }
    int res= 0,maxn = 0,sum = 0;
    for(int i = 1;i <= n;i++){
    if(st[i] == true) sum+=a[i];
        else maxn += a[i];
        if(i >= k + 1){
            if(st[i-k] == false) {
                maxn -= a[i-k];
            }
        }
        res = max(maxn,res);
    }
  printf("%d",res+sum);
    return 0;
}
目录
相关文章
|
数据采集 机器学习/深度学习 数据挖掘
python数据分析——数据预处理
数据预处理是数据分析过程中不可或缺的一环,它的目的是为了使原始数据更加规整、清晰,以便于后续的数据分析和建模工作。在Python数据分析中,数据预处理通常包括数据清洗、数据转换和数据特征工程等步骤。
463 0
|
SQL 分布式计算 Hadoop
大数据行业部署实战1:Hadoop伪分布式部署
大数据行业部署实战1:Hadoop伪分布式部署
735 0
|
SQL 缓存 NoSQL
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
本篇文章详细说明了幂等性,解释了什么是幂等性,幂等性的使用场景,讨论了幂等和防重的概念。分析了幂等性的情况以及如何设计幂等性服务。阐述了幂等性实现防重的几种策略,包括乐关锁,防重表,分布式锁,token令牌以及支付缓冲区。
8306 0
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
|
存储 缓存 Rust
一文读懂 Deno
一文读懂 Deno
490 0
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
412 0
【Python机器学习】Mean Shift、Kmeans聚类算法在图像分割中实战(附源码和数据集)
|
前端开发 iOS开发
input框设置placeholder属性在iOS中显示不完整
input框设置placeholder属性在iOS中显示不完整
184 1
|
存储 内存技术
内存条RAM详细指南
内存条(RAM)是电脑中用于临时存储数据和程序的部件,CPU依赖它执行操作。内存条经历了从主内存扩展到读写内存整体的发展,常见类型包括SDRAM和DDR SDRAM。内存容量、存取时间和奇偶校验是衡量其性能的关键指标。在选购时,应考虑类型、容量、速度和品牌,知名品牌的内存条提供更好的可靠性和稳定性。
3234 2
|
9月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
10月前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
480 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现

热门文章

最新文章