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

该博客介绍了如何通过二分查找和贪心算法来解决一个生物学问题,即如何以最小代价修改基因序列,使得其成为非递减序列,从而提高白菜的附加值。博主给出了具体的算法实现,包括输入处理、二分查找函数以及主要的解题思路,最终得出所需最小代价。此问题的解决方案涉及到字符串处理和算法优化。
摘要由CSDN通过智能技术生成

链接:https://ac.nowcoder.com/acm/contest/11211/A
来源:牛客网
 

题目描述

大科学家dddddd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dddddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddddd开始着手修改白菜的基因序列,dddddd每次修改基因序列的任意位需要的代价是111,dddddd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。
 

输入描述:

第一行一个正整数n(1≤n≤1000000)

第二行一个长度为n的字符串,表示所给白菜的基因序列

保证给出字符串中有且仅有大写英文字母、

输出描述:

输入一行,表示最小代价。

示例

输入:

     5

     ACEBF

输出:

     1

解题思路:

查找需要更改的最少的字符个数,就是求字符串序列中的最长非递减子序列,即整个字符串中不用更改的最长序列,再用字符串长度n减去求得的最长非递减子序列即为答案。(二分查找+贪心算法)(也可以用dp,但是有可能会超时)

#include<bits/stdc++.h>
using namespace std;
const int N=1000005; 
char a[N],q[N];
int n,tail;

int find(char x)//二分查找
{
	int l,r,mid;
	l=1;
	r=tail;
	int s=-1;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(x>=q[mid-1]&&x<=q[mid])
			s=max(s,mid);
		if(x>=q[mid])
			l=mid+1;
		else 
			r=mid-1;
	}
	return s;
}

int main()
{
	scanf("%d",&n);
	scanf("%s",a+1);//从a+1为开始存,便于初始化q[0]
	q[0]='A'-1;//将q[0]初始化为比'A'还小的字符
	tail=0;
	for (int i=1;i<=n;i++)
		if(a[i]>=q[tail])
			q[++tail]=a[i];//将遍历到的字符存到q数组的后端
		else//不能插入后端时
		{
			int x=find(a[i]);//二分查找a[i]能插入的位置
			if(x!=-1)
				q[x]=a[i];//如果查找到即可插入到所查找的位置
		}
	printf("%d\n",n-tail);//用字符串长度减去最长非递减子序列长度
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值