我先来说一下错误的思路,也就是我最原先的思路:
就是这个咱只求一个方向就行,
因为另一个方向是相同的道理
比如竖直方向
也就是Y轴
先求出第一次的最远距离
然后求一下第一次的终点
这样,我们就可以进行讨论了
讨论这个终点和最远距离的位置关系、
我给你画一个图
红色的是最大的那个点
、蓝色的是终点
水平和竖直是一样的道理,所以我就只画了一个竖直
如果是图一的话,需要判断终点在哪里
如果在下面则是 dis=max(maxL,abs(k*L));
L为距离原点的距离
大概就是这个意思
以上是我的思路,然后最后:
就是这样;然后我发现自己错了之后,哎好后悔,然后就直接做出来了(看了一下网上AC的代码);
大体思路就是:
出现最大值的位置出现在两个地方
1:在第一次走的过程中;
2:在最后的终点;
所以我们先找出第一次运行过程中的的最远距离,然后找出第一次的终点,这样我们把这个终点的坐标扩大K倍,然后再走一次,这一次也就是最后一次;
这样我们就可以得到最有解;
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const int N =1e6 +10;
#define boost ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
char str[N];
int main()
{
boost;
ll t,n,k;
cin>>t;
// scanf("%lld",&t);
while(t--)
{
// scanf("%lld%lld",&n,&k);
cin>>n>>k;
// scanf("%s",str);
cin>>str;
ll maxl=0,x=0,y=0;
for(int i=0;i<n;i++)
{
if(str[i]=='U') y++;
if(str[i]=='D') y--;
if(str[i]=='R') x++;
if(str[i]=='L') x--;
if(abs(x)+abs(y)>=maxl)
maxl=abs(x)+abs(y);
}
x=(k-1)*x;
y=(k-1)*y;
for(int i=0;i<n;i++)
{
if(str[i]=='U') y++;
if(str[i]=='D') y--;
if(str[i]=='R') x++;
if(str[i]=='L') x--;
if(abs(x)+abs(y)>=maxl)
maxl=abs(x)+abs(y);
}
cout<<maxl<<endl;
// printf("%lld\n",maxl);
}
return 0;
}
我就不写注释了,代码不是很复杂;