传送门: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4115
昨天赛场上只想到了一种情况:最远点一定是在最后一次循环中产生的,且一定是第一次循环中最远点对应的那个点,因此想到的只是求出第一次循环中的终点,找到它相对于第一次循环里最远点的相对位置,然后。。。。。WA了。
后来,大佬的点拨才发现,脑子是个好东西啊啊啊啊啊!也可以在第一次啊!
比如, n=26, k=2;
RRRRRRUUUUUULLLLLLLDDDDDDD;画一画你就知道了^ ^;
然后经过自己的一些验算可以发现最远点其实只会在第一次循环个和最后一次循环中产生的;
所以AC代码如下:
1 /* */ 2 # include <stdio.h> 3 # include <stdlib.h> 4 struct node1 5 { 6 long long int xx; 7 long long int yy; 8 }ss[110000]; 9 10 struct node2 11 { 12 long long int xxx; 13 long long int yyy; 14 }sss[110000]; 15 16 int main() 17 { 18 long long int T, n, k, i, x, y, maxq, maxz, t1, t2, t, tt1, tt2, tt; 19 char s[110000]; 20 long long int xz, yz; 21 while( ~ scanf("%lld", &T) ) 22 { 23 while( T-- ) 24 { 25 scanf("%lld %lld", &n, &k); 26 getchar(); 27 gets(s); 28 maxq = 0; 29 maxz = 0; 30 x = 0; 31 y = 0; 32 for( i=0; i<n; i++ ) 33 { 34 if( s[i]=='R' ) 35 { 36 x++; 37 } 38 if( s[i]=='L' ) 39 { 40 x--; 41 } 42 if( s[i]=='U' ) 43 { 44 y++; 45 } 46 if( s[i]=='D' ) 47 { 48 y--; 49 } 50 ss[i].xx = x; 51 ss[i].yy = y; 52 t1 = x - 0; 53 t2 = y - 0; 54 if( t1<0 ) 55 { 56 t1 = -t1; 57 } 58 if( t2<0 ) 59 { 60 t2 = -t2; 61 } 62 t = t1+t2; 63 if( t>maxq ) 64 { 65 maxq = t; 66 } 67 } 68 xz = x * (k-1);///第(k-1)次循环的终点,最后一次循环的起点 69 yz = y * (k-1); 70 for( i=0; i<n; i++ ) 71 { 72 if( s[i]=='R' ) 73 { 74 xz++; 75 } 76 if( s[i]=='L' ) 77 { 78 xz--; 79 } 80 if( s[i]=='U' ) 81 { 82 yz++; 83 } 84 if( s[i]=='D' ) 85 { 86 yz--; 87 } 88 sss[i].xxx = xz; 89 sss[i].yyy = yz; 90 tt1 = xz - 0; 91 tt2 = yz - 0; 92 if( tt1<0 ) 93 { 94 tt1 = -tt1; 95 } 96 if( tt2<0 ) 97 { 98 tt2 = -tt2; 99 } 100 tt = tt1+tt2; 101 if( tt>maxz ) 102 { 103 maxz = tt; 104 } 105 } 106 if( maxz>maxq ) 107 { 108 printf("%lld ", maxz); 109 } 110 else 111 { 112 printf("%lld ", maxq); 113 } 114 } 115 } 116 return 0; 117 }