题目
{% fold 点击显/隐题目 %}
pw不仅喜欢蹭饭,还特别能吃,他每天要吃n顿饭。现在他正在feynman家中,准备吃今天的第一顿饭。当然蹭饭也是要有原则的,不能连续在一个朋友家蹭饭。
Pw不仅能吃,还特别懒。他要吃n顿饭,还想要走的总路程最小,请你帮他算算最少要走多少米的路程。
题解
虽然是最短路问题,但是不需要使用DFS、BFS
可以自己画一画就可以发现,其实不管蹭多少顿饭,其实都是在最短的那条路上循环往返
所以只需要第一步走到最短的路上,然后直接用次数乘最短路的距离即可
代码
{% fold 点击显/隐代码 %}```cpp 蹭饭 https://github.com/OhYee/sourcecode/tree/master/ACM 代码备份
#include
#include
#include
#include
using namespace std;
int n;
int d[3];// 0->1 0->2 1->2
int dfs(int deep,int pos,int cost){
if(deep<=0)
return cost;
if(pos==0){
return min(dfs(deep-1,1,cost+d[0]),dfs(deep-1,2,cost+d[1]));
}else if(pos==1){
return min(dfs(deep-1,0,cost+d[0]),dfs(deep-1,2,cost+d[2]));
}else{
return min(dfs(deep-1,0,cost+d[1]),dfs(deep-1,1,cost+d[2]));
}
return -1;
}
int main(){
// freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&n,&d[0],&d[1],&d[2]);
int ans;
if(n>1){
ans = dfs(1,0,0);
ans += (n-2)*min(d[0],min(d[1],d[2]));
}else{
ans = dfs(n-1,0,0);
}
printf("%d\n",ans);
return 0;
}
{% endfold %}