大意:给定一个长度为n的字符串,输出相差为m的字符串(任何一个),不存在为-1.
思路:就是一个贪心,最值为当前字符到a或z的最大值的和。前边进行a,z,a,z的匹配,满足跳出条件前直接将当前的字符向前后者向后移动。最后字符长度直接拉下来即可- -。
#include<map>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#define LL int
#define inf 0x3f3f3f3f
const double PI=acos(-1.0);
using namespace std;
char s[100010],s1[100010];
int main(){
LL n,m,i,j,k,tmp,sum,ans;
while(~scanf("%d%d",&n,&m)){
scanf("%s",s);
sum=ans=tmp=0;
for(i=0;s[i]!='\0';++i){
ans+=max(s[i]-'a','z'-s[i]);
}
if(ans<m){
puts("-1");continue;
}
for(i=0;i<n;++i){
LL p='z'-s[i];
LL q=s[i]-'a';
if(m>=max(p,q)){
if(p>q){
m-=p;
printf("z");
}
else{
m-=q;
printf("a");
}
if(m==max(p,q))
break;
}
else if(m<max(p,q)){
if(p>q){
//m-=q;
printf("%c",s[i]+m);
}
else{
//m-=p;
printf("%c",s[i]-m);
}
break;
}
//cout<<m<<endl;
}
for(i=i+1;i<n;i++){
printf("%c",s[i]);
}
puts("");
}
return 0;
}