原题:https://vjudge.net/contest/303617?tdsourcetag=s_pcqq_aiomsg#problem/C
题目大意:
一个点(x,y)在坐标轴上按如下规则移动(默认最初点为(0,0):
- “U”向上移动一个单位;
- “D”向下移动一个单位;
- “R”向右移动一个单位;
- “L”向左移动一个单位;
输入:
第一行是整数T,有T组样例;
每组样例中,第一行是整数n、m,代表有n个操作,m次执行这n个操作,第二行是字符串,是要执行的操作;
输出:
对每组样例,在一行中输出|x|+|y|的最大值;
思路:
对一组样例来说,每次执行的n个操作都是一样的,所以要求的最大值的点也是一样的;
所以代码思路为:
- 先进行一次n个操作,求得最大值max;
- 将max扩大m倍即为所求;
但在提交后是WA的,然后经过寻找样例测试,发现当在一组操作中(即一次n个操作)可能会有多个点满足 条件(即有多个点使|x|+|y|=max),所以改进代码如下: - 先进行一次n个操作,求得最大值max;
- 将max扩大(m-1)倍;
- 在对第m次操作进行检验,找出最满足条件的max,即为所求;
代码:
#include<iostream>
#include<cmath>
using namespace std;
char str[100010];
typedef long long LL;
int main()
{
int t;
cin >> t;
while( t-- ){
LL n, k;
cin >> n >> k >> str;
LL x = 0,y = 0;//出发点为(0,0)
LL max = 0;
//第一步
for( LL 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( max<(abs(x)+abs(y)) ){
max=(abs(x)+abs(y));
}
}
//第二步
x=x*(k-1);
y=y*(k-1);
//第三步
for( LL 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( max<(abs(x)+abs(y)) ){
max=(abs(x)+abs(y));
}
}
cout << max << endl;
}
return 0;
}