【牛客刷题】笔记1

目录

1、数组中两个字符串的最小距离

2、dd爱框框

3、除2!


1、数组中两个字符串的最小距离

数组中两个字符串的最小距离_牛客题霸_牛客网 (nowcoder.com)

我们可以使用一个i来遍历数组,并用prev1来记录字符串1在上一次出现的下标,prev2记录字符串2在上一次出现的下标,prev1和prev2都初始化为-1,因为最先开始还每遍历,并不知道第一个字符串1和第一个字符串2在哪里。当i指向的值是prev1时,计算一下i到prev2的距离,并与ans取小,再将prev1的值改成i,当i指向的值是prev2时也是同理。

复制代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    int n; cin >> n;
    string str1, str2; cin >> str1 >> str2;
    int ans = 0x3f3f3f3f, prev1 = -1, prev2 = -1;
    for(int i = 0;i < n;i++)
    {
        string str; cin >> str;
        if(str == str1)
        {
            if(prev2 != -1) ans = min(ans, i - prev2);
            prev1 = i;
        }
        else if(str == str2)
        {
            if(prev1 != -1) ans = min(ans, i - prev1);
            prev2 = i;
        }
    }
    if(ans == 0x3f3f3f3f) cout << -1 << endl;
    else cout << ans << endl;
    return 0;
}

2、dd爱框框

dd爱框框 (nowcoder.com)

这道题就是使用滑动窗口。当窗口中值的和小于x时,入窗口。当窗口中的值大于等于x时,先更新结果,再出窗口,直到窗口中的值小于x,出窗口完毕,再继续入窗口。为了将区间长度与区间左右端点对应起来,我们可以使用unoredered_map

复制代码
#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

const int N = 1e7 + 10;
int n, x, a[N];

int main() {
    unordered_map<int, pair<int, int>> up;
    scanf("%d%d", &n, &x);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]); // 注意:下标是从1开始的
    int l = 1, r = 1, sum = 0, m = 0x3f3f3f3f;
    while (r <= n)
    {
        while (r <= n && sum < x) sum += a[r++]; // 入窗口
        while (l <= r && sum >= x) // 出窗口
        {
            m = min(m, r - l); // m用来存储mp中的最小值
            if (!up.count(r - l)) up[r - l] = { l, r - 1 }; // 若没有则加入
            sum -= a[l++];
        }
    }
    // cout << up[m].first << " " << up[m].second << endl;
    printf("%d %d\n", up[m].first, up[m].second);
    return 0;
}

3、除2!

除2! (nowcoder.com)

这道题很明显就是每次将数组中最大的偶数除以2,直到数组中没有偶数了,或者已经进行了k次操作。所以,我们使用一个大根堆来存储数组中的偶数,而奇数不放入大根堆,我们开一个sum来存储奇数。注意,这个sum一定要是long long类型的,因为有1e5个数,而每个数的最大值是1e9。每次操作,取出堆顶的元素,将其除以2,若结果是偶数,则再放回堆,若结果是奇数,则加入sum。直到进行了k次操作或者还没进行k次操作堆中就已经没有元素了,若是进行了k次操作结束的,堆中可能还有元素,最后需要将这些元素加入sum。最终sum就是结果

复制代码
#include <iostream>
#include <queue>
using namespace std;

int n, k;

int main() {
    long long sum = 0;
    priority_queue<int> pq;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
    {
        int x; cin >> x;
        if (x % 2 == 1) sum += x;
        else pq.push(x);
    }
    while (k-- && !pq.empty())
    {
        int x = pq.top(); pq.pop();
        if ((x / 2) % 2 == 1) sum += (x / 2);
        else pq.push(x / 2);
    }
    while (!pq.empty())
    {
        sum += pq.top(); pq.pop();
    }
    printf("%lld\n", sum);
    return 0;
}
相关推荐
ゞ 正在缓冲99%…12 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong13 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh32 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L33 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI39 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四42 分钟前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
正脉科工 CAE仿真1 小时前
基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
人工智能·python·算法
爱喝热水的呀哈喽1 小时前
Java 集合 Map Stream流
数据结构
Dovis(誓平步青云)1 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法