牛客小白月赛34

牛客小白月赛34部分题解 A.dd爱科学1.0 思路: 最长上升(非严格)子序列,DP做法复杂度O(n*26),因为值域只是’A’~'Z’所以速度比贪心快; f[i]表示以s[i]结尾最长的上升序列; last[k]表示上个s[i]==(k+‘A’)的i位置; code:DP #include<bits/stdc++.h> using namespace std; int n; string s; int f[1000010]; string t; int last[28]; int main() { cin&g 阅读详情

A dd爱科学1.0

主要思路

本质上求最长不下降子序列,dp解法,详细版本可以参考y总算法基础课

f[i]表示以a[i]结尾的最长不下降子序列长度,考虑如何更新f[i]

用j遍历1到i - 1,当w[i] >= w[j]时,更新f[i] = max(f[i], f[j] + 1)

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
int f[N], n;
char a[N];

int main(void)
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    
    for(int i = 1; i <= n; i++)
    {
        f[i] = 1;//f[i]最小值为1
        for(int j = 1; j < i; j++)
        {
            if(a[i] >= a[j]) f[i] = max(f[i], f[j] + 1);//更新f[i]
        }
    }
    
    int res = 0;
    for(int i = 1; i <= n; i++) res = max(res, f[i]);
    
    cout << n - res << endl;
    return 0;
}

复杂度为O(n ^ 2),本题的数据范围为10 ^ 6会超时,考虑如何优化

首先考虑每一种长度的不下降子序列我们只需要存储该子序列末尾的最小值即可。

假设以两个元素a[i]和a[j]结尾的最长不下降子序列长度都为len,且a[i] < a[j],那么我们后续在更新其他元素时一定会用a[i]更新,不会用a[j]更新,所以每一种长度的不下降子序列我们只需要存储该子序列末尾的最小值即可。

我们用q[i]存储长度为i的最长不下降子序列结尾的最小值。

继续考虑q[i]数组的性质。

用反证法,假设q[i] > q[i + 1],也就是说长度为i的子序列末尾的最小值 > 长度为i + 1子序列末尾的最小值,那么

我们一定可以用q[i + 1]去更新q[i],所以一定有q[i] <= q[i + 1],所以q[i]数组具有单调性。

我们在更新f[i]时,只需要二分出q数组中第一个值小于等于a[i]的即可,也就是说找到值小于等于a[i]的最长长度。

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
using namespace std;

#define int long long
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 1000010;
int n, f[N], q[N];

signed main(void)
{
    std::ios::sync_with_stdio(false);
    cin >> n;
    string t;
    cin >> t;
    int len = 0;
    for(int i = 0; i < n; i++)
    {
        int l = 0, r = len;//二分
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(q[mid] <= t[i]) l = mid;
            else r = mid - 1;
        }
        len = max(len, r + 1);//二分的结果r就是值小于等于t[i]的最长长度,更新最长长度
        q[r + 1] = t[i];//更新当前r+1长度的值。
        //因为如果q[r+1]是小于等于t[i]的那么二分的结果应该为r+1,不是r
        //所以q[r+1]一定大于t[i],直接赋值即可
    }
    cout << n - len << endl;
    return 0;
}

B dd爱探险

主要思路

状态压缩dp

首先 n个点 n-1次跳完,明白这个跳跃过程其实是一条链,每个点只有被经过和没被经过两个状态,所以典型状压dp。

对于一个数i,我们把它转化为2进制,2进制一共n位,第i位为0表示第i个点没被经过,为1表示第i个点已经被经过

定义f [ i ] [ j ] [k]为当前经过点的状态为i,当前在j这个点上,k为0表示没经历过加速,k为1表示仅经历过重力加速,k为2表示仅经历过反重力加速,k为3表示经历过两次加速。

枚举最后停留的位置j,j范围为1~n,答案为min(f[(1 << n) - 1] [j] [3])。1 << n - 1表示所有点都被经过,有n个1的状态。

状态转移方程见代码

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#include <unordered_map>
#include <queue>
using namespace std;

#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 17;
int n, p[N][N];
int f[1 << N][N][4], st[N];
int a[N], b[N];

int main(void)
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cin >> p[i][j];
        }
    }
    
    memset(f, 0x3f, sizeof(f));
    
    for(int i = 1; i <= n; i++)
    {
        f[1 << (i - 1)][i][0] = 0;
    }
    
    for(int t = 1; t < (1 << n); t++)
    {
        int x = t;
        for(int i = 1; i <= n; i++) st[i] = x & 1, x >>= 1;//更新当前状态上第i个点有没有被访问过
        
        int ta = 0, tb = 0;
        for(int i = 1; i <= n; i++)
        {
            if(st[i]) a[++ta] = i;//被访问过的存到a数组
            else b[++tb] = i;//没被访问过的存到b数组
        }
        
        for(int i = 1; i <= ta; i++)//枚举由哪个已经被经过的点跳到哪个没被经过的点
        {
            for(int j = 1; j <= tb; j++)
            {
                //t + (1 << (b[j] - 1))表示将b[j]位修改为1
                f[t + (1 << (b[j] - 1))][b[j]][0] = min(f[t + (1 << (b[j] - 1))][b[j]][0], f[t][a[i]][0] + p[a[i]][b[j]]);
                //没经历过加速的点只能由没经历过加速的点转移
                f[t + (1 << (b[j] - 1))][b[j]][1] = min(f[t + (1 << (b[j] - 1))][b[j]][1], min(f[t][a[i]][1] + p[a[i]][b[j]], f[t][a[i]][0]));
                //经过重力加速的点能由没经历过加速的点和经历过重力加速的点转移
                f[t + (1 << (b[j] - 1))][b[j]][2] = min(f[t + (1 << (b[j] - 1))][b[j]][2], min(f[t][a[i]][2] + p[a[i]][b[j]], f[t][a[i]][0] + 2 * p[a[i]][b[j]]));
                //经历过反重力加速的点能由没经历过加速的点和经历过反重力加速的点转移
                f[t + (1 << (b[j] - 1))][b[j]][3] = min(f[t + (1 << (b[j] - 1))][b[j]][3], min(f[t][a[i]][3] + p[a[i]][b[j]], min(f[t][a[i]][1] + 2 * p[a[i]][b[j]], f[t][a[i]][2])));
                //经历过两次加速的点能由经历过一次加速的点和经历过两次加速的点转移
            }
        }
    }
    int res = 0x3f3f3f3f;
    for(int i = 1; i <= n; i++)
    {
        res = min(res, f[(1 << n) - 1][i][3]);//更新答案
    }
    cout << res << endl;
    return 0;
}

C dd爱科学2.0

f[i] [j]表示更改到第i个位置 更新成的字母为 j 的总偏移量和

f[i] [j]为min(f[i - 1] [j]), j从1开始,换句话说f[i] [j]由第i - 1位中小于等于j的更新而来

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#include <unordered_map>
#include <queue>
using namespace std;

#define int long long
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 1000010;
int n, f[N][30];

signed main(void)
{
    std::ios::sync_with_stdio(false);
    cin >> n;
    string t;
    cin >> t;
    
    for(int i = 0; i < 26; i++) f[0][i] = abs(t[0] - 'A' - i);
    for(int i = 1; i < n; i++)
    {
        int minf = 0x3f3f3f3f;//维护f[i - 1][j]中更新成小于等于j的字母中的最小值
        for(int j = 0; j < 26; j++)
        {
            minf = min(minf, f[i - 1][j]);
            f[i][j] = minf + abs(t[i] - 'A' - j);
        }
    }
    
    int res = 0x3f3f3f3f;
    for(int i = 0; i < 26; i++)
    {
        res = min(res, f[n - 1][i]);//遍历结尾更新成哪个字母结果最小
    }
    cout << res << endl;
    return 0;
}

第二种dp方式

f[i] [j]表示改至第i位位置,最后一位小于等于j的最小值

则f[i] [j] = min(f[i] [j - 1], f[i - 1] [j] + abs(t[i] - ‘A’ - j));

状态转移方程的含义是f[i] [j]可以由改至第i位位置,最后一位小于等于j - 1的状态和改至第i - 1位位置,最后一位小于等于j的状态更新

最后答案位f[n] [26]

#include<bits/stdc++.h>
using namespace std;
int n,ans;
char a[1000005];
int f[1000005][30];
int main(){
	scanf("%d",&n);
	scanf("%s",a+1);
	memset(f,0x3f,sizeof(f));
	for (int i=1;i<=26;++i)f[0][i]=0;
	for (int i=1;i<=n;++i)
		for (int j=1;j<=26;++j)f[i][j]=min(f[i][j-1],f[i-1][j]+abs(a[i]-(j-1+'A')));
	printf("%d",f[n][26]);
} 

D dd爱矩阵

贪心+优先队列

我们先把问题简化,如果两行,每行 n个数,怎么选和前n大的所有数

把两行分别降序 sort,如果令第一行为数组 a,第二行为数组 b

则可得到最大值为 a[1]+b[1]

那么如何快速求出最大的n个数呢

我们把a[1] + b[j]的和, 1 <= j <= n,和当前a的位置,a[1]记为1,放入一个结构体中存入优先队列中,每次取出和最大的一个数,然后找到a的位置,让a的位置+1的数来替代当前a,同时把更新过的和放入优先队列(因为更新过后下一个前n大的数一定在优先队列中),取n次最大值就能找到前n大的所有数

这是两行的操作,我们进行n-1次就能求出所有前n大的数

复杂度n^2logn

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#include <unordered_map>
#include <queue>
using namespace std;

#define int long long
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 1000010;
int n;
int a[N], b[N], c[N];

struct node
{
    int pos, w;
    friend bool operator < (node x,node y) {
        return x.w < y.w;
    }
};

bool cmp(int a, int b)
{
    return a > b;
}

signed main(void)
{
    priority_queue<node> q;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    sort(a, a + n, cmp);
    
    for(int i = 2; i <= n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin >> b[j];
            q.push({0, a[0] + b[j]});//把a数组的位置和a[0],b数组的和放入优先队列
        }
        
        for(int j = 0; j < n; j++)
        {
            node t = q.top();//取出队头和最大的元素
            q.pop();
            c[j] = t.w;//记录一下前n大的元素
            int pos = t.pos + 1;//当前位置以及a数组的下一个位置
            q.push({pos, t.w - a[t.pos] + a[pos]});
        }
        
        for(int j = 0; j < n; j++) a[j] = c[j];
    }
    for(int i = 0; i < n; i++) cout << c[i] << ' ';
    return 0;
}

E dd爱旋转

操作1, 2进行两次都等同于没进行操作,模拟即可

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#include <unordered_map>
#include <queue>
using namespace std;

#define int long long
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 1010;
int n, q;
int a[N][N];
int ans[N][N];

void print()
{
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << ans[i][j] << ' ';
        }
        cout << endl;
    }
}

signed main(void)
{
    std::ios::sync_with_stdio(false);
    cin >> n;
    int t1 = 0, t2 = 0;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin >> a[i][j];
            ans[i][j] = a[i][j];
        }
    }
    
    cin >> q;
    for(int i = 0; i < q; i++)
    {
        int x;
        cin >> x;
        if(x == 1) t1++;
        else t2++;
    }
    t1 %= 2;
    t2 %= 2;
    if(t1)
    {
        int cnt1 = 0, cnt2 = 0;
        for(int i = n - 1; i >= 0; i--)
        {
            for(int j = n - 1; j >= 0; j--)
            {
                ans[cnt1][cnt2++] = a[i][j];
            }
            cnt1++;
            cnt2 = 0;
        }
        memcpy(a, ans, sizeof(ans));
    }
    
    if(t2)
    {
        int cnt1 = 0, cnt2 = 0;
        for(int i = n - 1; i >= 0; i--)
        {
            for(int j = 0; j < n; j++)
            {
                ans[cnt1][cnt2++] = a[i][j];
            }
            cnt1++;
            cnt2 = 0;
        }
    }
    
    print();
    return 0;
}

F dd爱框框

思路1

前缀和+二分

首先二分出最小的区间长度,然后用前缀和遍历即可

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <string>
#include <cmath>
#include <unordered_map>
#include <queue>
using namespace std;

#define int long long
#define debug(a) cout << #a << " = " << a << endl;
#define x first
#define y second
typedef pair<int, int> P;

const int N = 10000010;
int a[N], s[N], n, m;

bool check(int mid)
{
    for(int i = 1; i + mid <= n; i++)
    {
        if(s[i + mid] - s[i - 1] >= m) return true;
    }
    return false;
}

signed main(void)
{
    scanf("%lld%lld", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
        s[i] = s[i - 1] + a[i];
    }
    
    int l = 1, r = n;
    while(l < r)
    {
        int mid = l + r >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    
    for(int i = 1; i + l <= n; i++)
    {
        if(s[i + l] - s[i - 1] >= m)
        {
            cout << i << ' ' << i + l << endl;
            break;
        }
    }
    return 0;
}
思路二

前缀和+双指针

#include <bits/stdc++.h>
using namespace std;

const int N = 10000009;
const int mod = 1e9 + 7;
 
int n, x, a[N];
int main() {
    cin >> n >> x;
    for(int i = 1; i <= n; i ++) scanf("%d", a + i);
    int sum = 0;
    int l = 1, r = 1;
    int ans = N, ansl = N;
    while(r <= n) {
        if(sum >= x) {
            if(r - l < ans)
                ans = r - l, ansl = l;
            sum -= a[l ++];
        }
        else sum += a[r ++];
    }
    cout << ansl << ' ' << ansl + ans - 1;
    return 0;
}
思路三

单调队列维护窗口移动

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
ll x, a[10000005], s;
int n;
int main(){
	scanf("%d%lld",&n, &x);
	for (int i = 1; i <= n; i++) scanf("%lld",&a[i]);
    int l = 0, r = n + 1;//表示答案
    int start = 1, end = 0;
    queue<int> q;//队列
    for(int i = 1; i <= n; i++)
    {
        s += a[i]; end = i;
        q.push(a[i]);
        while(q.size() && s - q.front() >= x) s -= q.front(), q.pop(), start++;
        //如果当前s - q.front() >= x那么将队头元素弹出队列,更新start,同时更新s
        if(s >= x)
        {
            if(r - l > end - start)//如果距离变小则更新
            {
                l = start;
                r = end;
            }
        }
    }
	printf("%d %d\n", l, r);
}
深入LSM6DSL的FIFO连续模式:基于STM32和MEMS库的数据流高效处理指南 本文深入探讨了LSM6DSL的FIFO连续模式,结合STM32硬件平台和ST官方MEMS库,提供了高效的数据流处理方案。通过优化I2C通信时序、中断驱动设计以及动态ODR调整,实现低功耗数据采集与处理,显著提升嵌入式传感器应用的性能和续航能力。 阅读详情

相关推荐

通达信股本变迁文件(gbbq)解密方法

近年来A股市场跌宕起伏真特么精彩,本人愚钝,被整爆仓,损失惨重 痛定思痛,认为交易这种对纪律要求极高,且必须完全排除情绪影响的勾当,还是应该交给程序来干 数据哪里来呢?当然是拿来主义。。。问券商的交易软件要呗 到处查资料,得知通达信的权息文件数据齐全,不仅含有除权除息数据,还含有限售解禁、增发、可转债上市等股本变化数据 ——这对于某些对成交量变化敏感的交易模型是非常重要的

不甘碌碌老,结庐铸宝刀 2万+

(牛客小白月赛34)dd爱科学1.0

链接:https://ac.nowcoder.com/acm/contest/11211/C 来源:牛客网 题目描述 大科学家dddd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddd开始着手修改白菜的基因序列,dddd每次可以选择基因序列的一位进行修改,每次当她把一个字母xx修改成yy时,会产生|x-y|∣x−y∣(即xx与yy的ASCIIASCII码差值的绝对值)的改动偏移量

dubai_ving的博客 1178

运算放大器多谐振荡器设计实战:从施密特触发器到波形生成

本文详细介绍了运算放大器在多谐振荡器设计中的实战应用,涵盖施密特触发器的迟滞比较原理、非稳态振荡器的自激机制以及单稳态和双稳态电路的设计技巧。通过具体案例和参数计算,帮助工程师掌握波形生成与信号处理的核心技术,提升电路设计效率与稳定性。

pz89012345的博客 217

【错题集-编程题】dd 爱科学 1.0(最长上升子序列 - 贪心 + 二分)

当考虑一个字符能否和前面的子序列组成非递增子序列时,不需要知道它是怎样的,只需要知道它的末尾字符是什么就行。所以,只需要将长度为 x 的所有子序列中,最小的末尾存起来。因为这道题的数据范围比较大,所以排除动态规划(N^2),应该用贪心 + 二分(N*logN)求出最长非下降子序列的长度。算法思路:要想改动最小,就应该在最长非下降子序列的基础上,对不是最长的部分进行更换。这道题目需要着重理解 dp 的含义,可以先自己模拟一下需要存储的数据的过程。

Elena's Blog 683

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

告别手册!S32K3XX的eMIOS实战:从GPT定时到PWM输出,一个通道搞定电机控制

本文深入探讨了NXP S32K3XX系列MCU的eMIOS模块在电机控制中的高效应用。通过单通道实现PWM生成、输入捕获和定时中断三大功能,展示了如何简化BLDC电机控制硬件设计。文章结合RTD库与寄存器级编程,提供动态模式切换和性能优化方案,显著降低CPU负载。

weixin_42522374的博客 146

牛客小白月赛34 A dd爱科学1.0

题面 题解 f [i] [j] : 已经处理到了前 i 个字母,第 i 个字母是 j 的最小花费 因为这个序列是非递减的,所以前一个不能大于后一个,直接枚举第 i -1 个字母是什么,来转移方程 代码 #include<bits/stdc++.h> using namespace std; const int N = 1e6 + 10; char s[N]; int n; int f[N][26]; int main() { cin >> n >&gt

qq_44791484的博客 353

大数据工程中的数据血缘分析工具比较

数据血缘(Data Lineage)是大数据治理中的核心组成部分,它描述了数据从源头到目标的完整流动路径。系统介绍数据血缘的核心概念和技术原理比较主流开源和商业数据血缘工具的功能特点提供数据血缘分析的实践指南和选型建议本文首先介绍数据血缘的基本概念,然后深入分析其技术原理和实现方法,接着比较主流工具的特点,最后通过实际案例展示应用场景。数据血缘(Data Lineage): 描述数据从源头到目标的完整流动路径,包括所有转换和处理步骤元数据(Metadata)

大数据洞察的博客 900

牛客小白月赛34题解

牛客小白月赛34题解 比赛链接 19点02分时发现比赛开始了,在纠结要不要打,如果打的话就亏了(狗头 过了一个小时上去看看,还是打了打hhh 除了G题没怎么看过。。 先放代码,之后再补题解和简单的题意hhh Add爱科学1.0 每次可以选择一个字符修改为另一个字符,使得最终字符串呈递增排序。 动态规划 对于当前字符si,dp当前字符变为A~Z需要的最小花费 int n,dp[30],mi[30]; char s[maxn]; void solve() { sd(n); sc(s+1);

XLH1129的博客 329

RK3566-预装APP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

qq_24093081的博客 702

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南

本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

【牛客小白月赛34】【霖行】F-dd爱框框

【牛客小白月赛34】【霖行】F-dd爱框框 题目 链接:https://ac.nowcoder.com/acm/contest/11211/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 读入n,x, 给出n个数a[1],a[2],……,a[n], 求最小的区间[l,r],使a[l]+a[l+1]+……+a[r]≥x ,若存在相同长度区间,输出 l 最小的那个 输入描述:

Jerome_Tong的博客 458

【人工智能】向量数据库全生命周期数据安全防护体系:破解向量化与检索双环节泄露风险

大模型时代,向量数据库已成为RAG(检索增强生成)架构、语义检索、多模态应用的核心基础设施,解决了大模型幻觉、长上下文窗口限制、私有知识落地等核心痛点。但行业普遍存在认知误区:将Embedding向量等同于“无害的语义压缩乱码”,忽视了向量数据原生的泄露风险。

奶爸的编程之路,也就一周冷个三天 159

牛客xb月赛34 B 状态压缩DP

题目 题解思路 将每个点跳或者不跳转化成二进制来表示状态。 dp[ i ] [ j ] [ k ] 集合 表示 当前状态为i,且在站在j上,使用两次加速的情况为 k 的 所有合法方案的代价 。 属性 代价的min 转移方程其实挺好推的,因为是很明确的哪个点到哪个点。(就是不要漏了情况) 参考题解 AC代码 #include <bits/stdc++.h> //#include <unordered_map> //priority_queue #define PII pai

从你的全世界路过 246

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

牛客小白月赛34 C dd爱科学2.0

题面 题解 f [i] [j] : 已经处理到了前 i 个字母,第 i 个字母是 j 的最小花费 因为这个序列是非递减的,所以前一个不能大于后一个,直接枚举第 i -1 个字母是什么,来转移方程,最小花费就是 s[i] 变到 字母 j+‘A’ 的偏移量 代码 #include<bits/stdc++.h> using namespace std; const int N = 1e6 + 10; char s[N]; int n; int f[N][26]; int main()

qq_44791484的博客 426

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

牛客小白月赛34 A-dd爱科学1.0

题目:dd爱科学1.0 Description 大科学家dddd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddd开始着手修改白菜的基因序列,dddd每次修改基因序列的任意位需要的代价是11,dddd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。 Input 第一行一个正整数n(1≤n≤1000000) 第二行一个长度为n的字符串,表示所给白菜的基因

叶子的小本本 776

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

牛客小白月赛34:A dd爱科学1.0

链接:https://ac.nowcoder.com/acm/contest/11211/A 来源:牛客网 题目描述 大科学家dddddd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dddddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddddd开始着手修改白菜的基因序列,dddddd每次修改基因序列的任意位需要的代价是111,dddddd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。 输入.

m0_56095461的博客 289

牛客xb月赛34 D 贪心优先队列 思维 经典技巧

题目 题解思路 这样贪心使得我们每次只查询了有可能成为新的值的情况。属实巧妙。 如何将这个两个数组的方法延展成N个数组的。 我们先处理出a数组的初始情况,再将a数组逐一和之后的每一个数组使用这个方法,将记录出的前N大的数再次更新进a数组,之后可能N大的值必然从这N个情况中改变。 参考这个题解 AC代码 #include <bits/stdc++.h> //#include <unordered_map> //priority_queue #define PII pair<i

从你的全世界路过 613

【双指针】【尺取法】牛客小bai月赛34 F dd爱框框

题目链接 尺取法 实际上和双指针差不多,就是一个头指针,一个尾指针。如果区间的总和不满足某个条件,那么头指针向前伸展,直到满足这个条件。满足之后,尾指针再向前伸展,如果还是满足这个条件,就一直往前伸展,在伸展的过程中一直维护答案。 本题题解 题意: 找到最短的区间长度满足区间和大于等于给定的值 思路: 就是尺取法,注意条件是左指针小于等于n,先右指针伸展,再左指针伸展。 r代表的是区间的右端点,l代表的是区间的左端点。 #include<bits/stdc++.h> using namespac

行码棋 368

牛客月赛34-dd爱整齐-(思维+贪心)

H 题意: 就是当k=1时abababab,k=2时abbabbabb,k=3时abbbabbb这种类型的是优美序列,现在给你一个n数组,和k,每次你可以让数组中的数减1,问你最少的操作次数使得n数组为k优美序列。当然不一定就是abbabb,bbabba这个也是2的优美序列。只要是优美学列的一段就行。同时要保证a>=b。 思考: 刚开始看到这种减少的我感觉是以前的那种dp题呢,但是看来看去感觉没法入手。然后去想贪心,a的位置到底放哪,但是怎么都感觉会超时没法做。最后看了题解就是要发现一个性质,对于i%

m0_52398496的博客 304
上一篇: Codeforces Round #723 (Div. 2)
下一篇: Codeforces Round #729 (Div. 2)
zhbbbb!
博客等级 码龄7年 43粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值