“葡萄城杯”牛客周赛 Round 53 vB-小红的字符串 题型:环类问题

79 阅读1分钟

B-小红的字符串_“葡萄城杯”牛客周赛 Round 53 (nowcoder.com)

这题我刚开始是这样想的,先全部转化为下标顺序值.然后从中间分成两部分,左边的相加和-右边的相加和得到的就是左边变成右边的的步数.右边的相加和减左边的得到的就是右边变为左边的步数,取一个较小值.

#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int> a;
vector<int> b;
string temp1,temp2;
signed main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
	string s;cin>>s;
	
	    temp1=s.substr(0,s.size()/2);
	    temp2=s.substr(s.size()/2);	


	  //cout<<temp1<<endl;
	  //cout<<temp2<<endl;
	  
	  for(int i=0;i<temp1.size();i++)
	  {
	  	a.push_back(temp1[i]-'a');
	  	b.push_back(temp2[i]-'a');
	  }
	  int sum1=0;
	  for(auto &it:a)
	  {
	  	//cout<<it<<" ";
	    sum1+=it;
	  }
	  //cout<<endl;
	  int sum2=0;
	  for(auto &it:b)
	  {
	  	sum2+=it;
	  	//cout<<it<<" ";
	  }
	  cout<<abs(sum1-sum2)<<endl; 
	  
	return  0;
}

image.png

正解

对于每个数到达它的左边的数都要顺时针到达和逆时针到达两种方式

取步数较小的那一个

image.png

#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans;
signed main()
{
	cin.tie(nullptr)->sync_with_stdio(false); 
    string s;cin>>s;
		
	int n=s.size();
	
	for(int i=0;i<n-1-i;i++)
	{
		int a=s[i]-'a',b=s[n-1-i]-'a';
	    if(a>b) swap(a,b);
		ans+=min(b-a,a+26-b); 
	}
	cout<<ans<<endl;
	return  0;
} 

image.png