【牛客刷题】笔记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;
}
相关推荐
你撅嘴真丑4 小时前
第九章-数字三角形
算法
uesowys5 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮5 小时前
AI 视觉连载1:像素
算法
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥6 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风6 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風6 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT067 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法