Codeforces 628 C Bear and String Distance

题面翻译

题目描述:

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

posted @ 2023-11-11 17:57  j1hx  阅读(15)  评论(0)    收藏  举报