我先来说一下错误的思路,也就是我最原先的思路:
就是这个咱只求一个方向就行,
因为另一个方向是相同的道理
比如竖直方向
也就是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; }我就不写注释了,代码不是很复杂;