列表

详情


NC221823. dd爱科学2.0

描述

大科学家最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的开始着手修改白菜的基因序列,每次可以选择基因序列的一位进行修改,每次当她把一个字母修改成时,会产生(即码差值的绝对值)的改动偏移量,希望,修改白菜的基因序列使其高附加值达到最高,并且基因序列的改动偏移量总和最小,她想知道最小的改动偏移量总和是多少。

输入描述

第一行一个正整数n(1≤n≤1000000)
第二行一个长度为n的字符串,表示所给白菜的基因序列
保证给出字符串中有且仅有大写英文字母

输出描述

输出一行,表示最小改动偏移量总和

示例1

输入:

5
AEEBC

输出:

5

说明:

改成AEEEE或ACCCC偏移量总和最小
改成AEEEE,偏移量总和为|B-E|+|C-E|=3+2=5
改成ACCCC,偏移量总和为|E-C|+|E-C|+|B-C|=2+2+1=5
所以最小偏移量总和为5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 58ms, 内存消耗: 2480K, 提交时间: 2021-06-09 00:03:23

#include<iostream>
#include<cmath>
using namespace std;
string s;
int n,a[27];
int main(){
	cin>>n>>s;
	for(int i=0;i<n;i++){
		int x=1e9;
		for(int j=1;j<=26;j++){
			x=min(x,a[j]);
			a[j]=x+abs(j-(s[i]-'A'+1));
		}
	}
	int ans=2e9;
	for(int i=1;i<=26;i++) ans=min(ans,a[i]);
	cout<<ans<<endl;
return 0;
}

上一题