P3403 跳楼机 50ptsRE求调
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e5+10;
int head[N*2],cnt;
struct edge{
int to,nxt,w;
}e[2*N];
void add(int u,int v,int w){
e[++cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].w=w;
head[u]=cnt;
}
int dis[N];
struct node{
int d,v;
friend bool operator<(node x,node y){
x.v>y.v;
}
};
void dfs(int u,int w){
priority_queue<node>dl;
dl.push(node{u,w});
dis[u]=0;
while(!dl.empty()){
node t=dl.top();
dl.pop();
if(t.v>dis[t.d])continue;
for(int i=head[t.d];i;i=e[i].nxt){
//cout<<t.d<<endl;
if(dis[t.d]+e[i].w<dis[e[i].to]){
dis[e[i].to]=dis[t.d]+e[i].w;
dl.push(node{e[i].to,dis[e[i].to]});
}
}
}
}
signed main(){
int h;cin>>h;
--h;
int x,y,z;cin>>x>>y>>z;
if(x>y)swap(x,y);
if(x>z)swap(x,z);
for(int i=0;i<x;i++){
add(i,(i+y)%x,y),add(i,(i+z)%x,z);
dis[i]=LONG_LONG_MAX;
}
dfs(0,0);
int ans=0;
for(int i=0;i<x;i++){
if(h>=dis[i])
ans+=(h-dis[i])/x+1;
}
cout<<ans;
return 0;
}
悬赏@ zhuyihao20100712 qq