2025-11-05 学习日记

发布于 2025-11-05 12:00 508 字 3 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. Problem-2145C-cf 关键词: 问题分析: 给定一个只含有'a'和'b'的字符串,然后要求删除最小的连续的字符能使 a 和 b 的数量相等,求最短删除多少 核心思路: ~~一开始想着记录 a 和 b 的数量,思维还是不行,太笨了~~ 如果记录 a 和 b 的数量,我们似乎需要两个状态量(a 的数量,b 的数量),我们可以把 a,b 抽象成 1 和-1,要 a 和 b...

今日学习记录

1. Problem-2145C-cf

关键词: 问题分析: 给定一个只含有’a’和’b’的字符串,然后要求删除最小的连续的字符能使 a 和 b 的数量相等,求最短删除多少

核心思路: 一开始想着记录 a 和 b 的数量,思维还是不行,太笨了 如果记录 a 和 b 的数量,我们似乎需要两个状态量(a 的数量,b 的数量),我们可以把 a,b 抽象成 1 和-1,要 a 和 b 数量相同不就是计算为 0 吗,我们可以想到先计算 a 和 b 差多少,再看之前的数组中如果删除某个字符就会对差值 s 产生影响,那么就是要找到某段子数组总和等于 s,将问题转变为求和为 s 的连续最短子数组. 毕竟 cf 是思维题,把问题分析之后才能变成我们所熟知的解决方法(枚举右,维护左)

哈希表

枚举右端点,同时记录左端点,找到pre[r] - sum = pre[l]

**最终代码:

#include <bits/stdc++.h>

using namespace std;

#define ve vector

using ll = long long;

using ull = unsigned long long;

using sr = string;

using db = double;

int T,n;

sr str;
//我们要找到变化的状态,将问题转变为找到长度最短和为s的连续子数组

int main() {

    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);

    cin>>T;

    while(T--){

        cin>>n>>str;

        ve<int> arr(n+1,0);

        for(int i = 0;i<n;i++)

            if(str[i]=='a') arr[i+1] = arr[i] - 1;

            else arr[i+1] = arr[i] + 1;

        int ans = INT_MAX;

        int sum = arr[n];

        //pre[r] - sum = pre[l]

        unordered_map<int,int> mp;

        mp[0] = 0;

        for(int i = 0;i<=n;i++){

            if(mp.count(arr[i]-sum)) ans = min(ans,i-mp[arr[i]-sum]);

            mp[arr[i]] = i;

        }

        if(ans==INT_MAX||ans==n) cout<<-1;

        else cout<<ans;

        cout<<endl;

    }

    return 0;

}

学到的点:

  1. 枚举

执笔 手写

随机文章

加载中...