Jumping Jack CodeForces - 11B
就是一个贪心。
基本思路:
正负没有关系,先取绝对值。
首先跳过头,然后考虑怎么回来。
设超过头的步数为kk。如果kk为偶数,那么直接在前面跳过来的步数中选一个kk/2的步数,改成反着跳即可,不需要额外步数。
如果kk为奇数:
显然如果只把前面跳的改成反着跳不可能导致位置与目标位置差值的奇偶性变化,而kk为奇数,需要达到的差值0是偶数,因此一定需要额外步数。
那么可能有两种情况:
设当前已经跳了p步。如果p为偶数,那么这一步的下一步(p+1)为奇数,只需要再跳一步,并且在前面找到一步为(kk+p+1)/2改成反着跳即可,需要1步额外的。(试一试能发现一定能找到改法,也不难证)
如果p为奇数,那么(p+1)为偶数,(p+1)为奇数,显然现在需要奇数步来使得位置与目标位置的差值由奇变成偶,因此要额外走2步。(试一试能发现一定能找到改法)
当然,像我这样做,有一些性质在距离为0的时候会出现不适合的情况,因此需要特判0。
错误记录:
找规律以偏概全,23行写成if((tt+1)%2==1)
1 #include<cstdio> 2 typedef long long LL; 3 LL x,tt,p,kk; 4 int main() 5 { 6 scanf("%lld",&x); 7 if(x==0) 8 { 9 printf("0"); 10 return 0; 11 } 12 if(x<0) 13 x=-x; 14 while(true) 15 { 16 tt+=++p; 17 if(tt>=x) break; 18 } 19 kk=tt-x; 20 if(kk%2==1) 21 { 22 p++; 23 if(p%2==0) 24 p++; 25 } 26 printf("%lld",p); 27 return 0; 28 }