直接跑的最短路,T 掉了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,x,y;
ll dis[20000100];
bool vis[20000100];
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
int main(){
scanf("%d%d%d",&n,&x,&y);
memset(dis,0x3f3f3f,sizeof(dis));
dis[1]=x;
q.push(make_pair(dis[1],1));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=true;
if(u!=2*n&&dis[u]+x<dis[u+1]){
dis[u+1]=dis[u]+x;
q.push(make_pair(dis[u+1],u+1));
}
if(u!=1&&dis[u]+x<dis[u-1]){
dis[u-1]=dis[u]+x;
q.push(make_pair(dis[u-1],u-1));
}
if(u<=n&&dis[u]+y<dis[u*2]){
dis[u*2]=dis[u]+y;
q.push(make_pair(dis[u*2],u*2));
}
}
printf("%lld",dis[n]);
}