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

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

それならゼロから、いや、ゼロから始めましょう - 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;
}
目录
相关文章
|
8月前
|
存储
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
50 0
|
8月前
DongDong认亲戚 - 并查集
DongDong认亲戚 - 并查集
32 0
|
8月前
|
算法
再探二分法
【2月更文挑战第5天】
68 3
|
8月前
|
容器
每日一题——接雨水(单调栈)
每日一题——接雨水(单调栈)
|
8月前
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
46 0
|
8月前
|
Java
每日一刷《剑指offer》字符串篇之左旋转字符串
每日一刷《剑指offer》字符串篇之左旋转字符串
65 0
每日一刷《剑指offer》字符串篇之左旋转字符串
|
8月前
|
图计算
【每日一题Day274】LC42接雨水 | 单调栈
【每日一题Day274】LC42接雨水 | 单调栈
58 0
线段树区间修改和点修改 hdoj 1698(区间修改)、hdoj 1754(点修改)
这两题我都在之前做过,但并未通过,那次做的时候是刚开始接触线段树,现在有了一点点的了解,翻出以前的代码稍作修改就AC了。之前1698错误的原因是没有注意到位运算的优先级。
36 0
|
算法
回溯算法——我欲修仙(功法篇)
回溯算法——我欲修仙(功法篇)
109 0
洛谷P1135 奇怪的电梯——广搜
洛谷P1135 奇怪的电梯——广搜
109 0