题目
题意:给出一串只有RL的字符串,给定起始位置,R表示向右,L表示向左,现在要求输出最少改变几个字符可以移动到字符第一个或者最后一个。
例如:
6 3
LLRRLR
起始位置是第三个字符R,只用改变第三个R就可以到达第一个字符L
这道题目通过模拟就可以做出来,就是将到达两边要改变的字符都求出来,输出最小的那个
见代码:
#include<cstdio>
using namespace std;
#define maxn 100005
char a[maxn];
int main()
{
int T;
scanf("%d",&T);
int n,m;
while(T--)
{
int count1=0,count2=1; //如果是去与起始字符相反的方向则需要算上起始位置的改变
scanf("%d%d",&n,&m);
scanf("%s",a);
if(a[m-1]=='R')
{
for(int i=m;i<n-1;i++) //从末尾向起始位置遍历
{
if(a[i]=='L') //遇见L就变为R,count1++
count1++;
}
for(int i=1;i<m-1;i++) //从开头到起始位置遍历
{
if(a[i]=='R') //遇见R变成L,count2++
{
count2++; //由于起始位置是R所以到左边需要改变自身,所以为count2
}
}
}
else //同理于起始位置为R
{
for(int i=m;i<n-1;i++)
{
if(a[i]=='L')
count2++;
}
for(int i=1;i<m-1;i++)
{
if(a[i]=='R')
count1++;
}
}
if(count1<count2)
printf("%d\n",count1);
else
printf("%d\n",count2);
}
return 0;
}