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);
}
621

被折叠的 条评论
为什么被折叠?



