牛客小白月赛34

A
题目描述
大科学家dddd最近在研究转基因白菜,白菜的基因序列由一串大写英文字母构成,dddd经过严谨的推理证明发现,只有当白菜的基因序列呈按位非递减形式时,这株白菜的高附加值将达到最高,于是优秀的dddd开始着手修改白菜的基因序列,dddd每次修改基因序列的任意位需要的代价是11,dddd想知道,修改白菜的基因序列使其高附加值达到最高,所需要的最小代价的是多少。
输入描述:
第一行一个正整数n(1≤n≤1000000)
第二行一个长度为n的字符串,表示所给白菜的基因序列
保证给出字符串中有且仅有大写英文字母
输出描述:
输出一行,表示最小代价
示例1
输入
5
ACEBF
输出
1
说明
改成ACEEF或者ACEFF,都只用改动一个字符,所需代价最小为1
最长不下降子序列
求出来最长不下降子序列,再用n减去即可。

#include<bits/stdc++.h>
using namespace std;
char s[10001011];
int a[10001011];
int dp[10000101];
int main()
{
    int n,i,j;
    scanf("%d",&n);
    scanf("%s",s);
    for(i=0;i<n;i++)
        a[i+1]=s[i]-'A';
    dp[1]=1;
    int len=1;
    for(i=2;i<=n;i++)
    {
        if(a[i]>=dp[len])
            dp[++len]=a[i];
        else
        {
            int j=upper_bound(dp+1,dp+len+1,a[i])-dp;
            dp[j]=a[i];
        }
    }
    printf("%d\n",n-len);
}

F
读入n,xn,x,给出n个数a[1],a[2],……,a[n]a[1],a[2],……,a[n],求最小的区间[l,r][l,r],使a[l]+a[l+1]+……+a[r]≥xa[l]+a[l+1]+……+a[r]≥x,若存在相同长度区间,输出ll最小的那个
输入描述:
第一行两个数,n(1≤n≤10000000),x(1≤x≤10000)
第二行n个数ai
输出描述:
输出符合条件l,r(保证有解)
输入
10 20
1 1 6 10 9 3 3 5 3 7
输出
3 5
l,r分别为区间长度的左右端点,初始l=1,r为从a[1]到a[r]的和大于等于X的地方。再让r向右移动,l也向右移动,使a[l]-a[r]的和大于等于X,使区间最小。观察到最后区间的最小值。

#include<bits/stdc++.h>
using namespace std;
int a[10000010],sum=0;
int main()
{
    int n,x,ans=9999999;
    scanf("%d %d",&n,&x);
    int i,j,l=1,r,f=0,l1=1,r1,maxx;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        if(sum>=x&&f==0)
        {
            maxx=sum;
            r=i;
            f=1;
        }
    }
    sum=maxx-a[r];
    int k=l;
    r1=r;
    while(r<=n)
    {
        sum+=a[r];
        for(i=l;i<=n;i++)
        {
            if(sum-a[i]>=x)
            {
                sum-=a[i];
                k=i+1;
            }
            else
                break;
        }
        l=k;
        if(ans>r-k)
        {
            l1=k;
            r1=r;
            ans=r-k;
        }
        r++;
    }
    printf("%d %d\n",l1,r1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值