题目链接:
http://codeforces.com/problemset/problem/1136/B
分析:
这个题思路还是比较明确的但是有几个小坑。
基本思路, 我们通过推演几次我们就会发现无论是哪种情况。每拿到一个硬币一定会经过三次的移动。 多推演几次就会知道。
那么我们就可以用这个来找到k左边的硬币全部拿取需要多少步,然后在从1号位置回到k号位置要多少步。最后把k右边的硬币全部拿取又要多少步。全部加起来就可以得到正确答案了。
但是我们在这里要考虑是先拿取k左边的好还是k右边的好。 这里有一个区别。
因为你选择了一边就决定了从那一边回到k号位置需要多少步。
然后,还要考虑当k=1和当k=n时候的特殊情况。
AC代码:
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
if(k==1)
{
printf("%d\n",n*3);
return 0;
}
if(k==n)
{
printf("%d\n",n*3);
return 0;
}
int cnt=k*3;
cnt+=(k-1)+(n-k)*3;
int minx=(n-k+1)*3;
minx+=(n-k)+(k-1)*3;
// printf("cnt=%d minx=%d\n",cnt,minx);
printf("%d\n",min(cnt,minx));
return 0;
}