先感叹下,太菜了太菜了 啊
题目链接
题目大意:
有n个保险柜,从1到n编号,1号为入口,每两个保险柜之间的距离是1,有一个编号为k的保险柜,它能打开其它的保险柜(注意:一次只能打开一个保险柜),需要从入口进入,去m个保险柜取东西,然后再从入口出去,让你求最短的路径。
解题思路:
一开始我理解错了,以为一次可以把所有的保险柜开了,就白白wa了一次,后来队友想出了一个思路把我绕进去了,至今还没明白,碰巧那时我妈突然电话连环call我,急着去回电话结果是给我吐槽买肉火烧被坑了(手动无奈)
这个题就是 你取一个之前都要跑一次k,那就是2*(abs(k-i)) 最后记得加上往返的 2*(k-1),还有如果K左边是有保险柜的,记得减去左边最小的那个,因为可以回去的时候顺便取了
代码如下:
#include<iostream>
using namespace std;
int main()
{
long long n,x,k,y,t,m,i,ans,minx;
k=0;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&m,&k);
ans=0;
y=0;
minx=k;
for(i=1;i<=m;i++)
{
scanf("%lld",&x);
y=abs(k-x);
ans+=(y*2);
minx=min(x,minx);
}
if(minx<k)
ans-=2*(k-minx);
ans+=2*(k-1);
printf("%lld\n",ans);
}
return 0;
}