7:41 AM [Poetize 9] 升降梯上 | |
【题目描述】开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。 【输入格式】第一行两个正整数N、M。 【输出格式】输出一个整数表示答案,即至少需要多长时间。若不可能到达输出-1。 【样例输入】6 3 【样例输出】19 【提示】手柄从第二个槽扳到第三个槽(0扳到2),用时1秒,电梯上升到3层,用时4秒。 题解: 本题较水,可以说很水,但是刚开始E了。。重写一遍后AC,其实,和迷之阶梯差不多,按照SPFA的思路搜索,从1开始,按照每个档位一次是,开一个ans的二维数组记录在K层时,档位是J时的最优值,每回如果比最优值优就更新。。反之不更新。。。 代码: C++语言:made by PaulInsider!
#include #include #include #include using namespace std; int n,m,w[30],ans[1005][30],tou,flo,tmp,use,answer=999999; struct hehe { int ceng,num,number; }temp; queue<hehe>q; int aabs(int x) { if (x>=0) return x; else return 0-x; } void bfs(); int main() { freopen ("updown.in","r",stdin); freopen ("updown.out","w",stdout); cin>>n>>m; for (int i=1;i<=m;i++) { cin>>w[i]; if (w[i]==0) { tou=i; } for (int j=0;j<=n;j++) { ans[j][i]=999999; } } bfs(); for (int i=1;i<=m;i++) { if (answer>ans[n][i]) answer=ans[n][i]; } if (answer==999999) cout<<-1; else cout<<answer; return 0; } void bfs() { temp.ceng=1; temp.num=tou; temp.number=0; q.push(temp); ans[1][tou]=0; while (!q.empty()) { for (int i=1;i<=m;i++) { flo=q.front().ceng+w[i]; tmp=aabs(q.front().num-i); use=tmp+abs(w[i])*2; if (flo>0&&flo<=n&&ans[flo][i]>q.front().number+use) { ans[flo][i]=q.front().number+use; temp.ceng=flo; temp.num=i; temp.number=ans[flo][i]; q.push(temp); } } q.pop(); } } | |
|
Total comments: 0 | |