C - Wandering Robot ZOJ - 4115

    xiaoxiao2024-12-06  60

     


    我先来说一下错误的思路,也就是我最原先的思路:

    就是这个咱只求一个方向就行,

    因为另一个方向是相同的道理

    比如竖直方向

    也就是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; }

    我就不写注释了,代码不是很复杂;

    最新回复(0)