题面翻译
题目描述:
Limak是一只小北极熊。他喜欢单词——只由小写字母构成,长度为n的单词。
他规定dist(s,s')的值为s与s'在26个字母中的间距。如,dist(c,e)=dist(e,c)=2,dist(a,z)=dist(z,a)=25。
而且,当dist两个单词时,其值为dist第一个字母+dist第二个字母+……
如,dist(af,db)=dist(a,d)+dist(f,b)=3+4=7,dist(bear,roar)=16+10+0+0=26。
现在,Limak给你一个字母或单词s和值k,令你寻找一个s'使dist(s,s')=k。输出s'。如果没有合适的s',输出-1。
输入格式
第一行输入两个数:n和k。 ( 1<=n<=10^5
, 0<=k<=10^6
)。
第二行输入只由小写字母构成,长度为n的单词s。
输出格式
如果没有合适的s',输出-1。
否则,输出s',令dist(s,s')=k。
样例 #1
样例输入 #1
4 26
bear
样例输出 #1
roar
样例 #2
样例输入 #2
2 7
af
样例输出 #2
db
样例 #3
样例输入 #3
3 1000
hey
样例输出 #3
-1
思路
简单贪心。按顺序往后,对每一个字符,将其变为与它dist最大的字符(a
或者z
).d再减去相应的dist,
一直减到d为0,剩余的字母则不变直接输出。若一直到最后一位d仍然大于0,则说明不存在,输出-1.
代码实现
#include<bits/stdc++.h>
using namespace std;
int dist(char a,char b)
{
return abs((int)a-(int)b);
}
int main()
{
ios::sync_with_stdio(false);
int n,k;
string s;
cin>>n>>k;
cin>>s;
int i=0;
bool flag=0;
while(i<n)
{
int d=max(dist(s[i],'a'),dist(s[i],'z'));
if(k-d<=0)
{
if(islower(s[i]-k))
{
s[i]-=k;
}
else
{
s[i]+=k;
}
flag=1;
break;
}
else
{
k-=d;
if(s[i]<'n')
{
s[i]='z';
}
else
{
s[i]='a';
}
}
i++;
}
if(!flag)
{
cout<<-1<<endl;
}
else cout<<s<<endl;
return 0;
}
标签:Distance,dist,输出,int,628,样例,CF,单词,输入
From: https://www.cnblogs.com/j1hx-oi/p/17826155.html