60pts求助
  • 板块P3403 跳楼机
  • 楼主ABookCD
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/1/17 23:14
  • 上次更新2023/10/28 12:05:54
查看原帖
60pts求助
502702
ABookCD楼主2022/1/17 23:14
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long  v,w;
	node (long long  uu,long long vv){
		v=uu;
		w=vv;
	}
};
const long long N=1000010;
vector<node> G[N];
set<pair<long long,long long > > min_heap;
long long d[N];
void init(){
	for(int i=1;i<=N;i++){
		d[i]=0x3f3f3f3f3f3f;
	}
}
int main(){
	long long h,x,y,z;
	cin>>h>>x>>y>>z;
	for(long long  i=0;i<z;i++){
		G[i].push_back(node((i+x)%z,x));
		G[i].push_back(node((i+y)%z,y));
	}
	 init();
	 d[0]=1;
	 min_heap.insert(make_pair(1,0));
	 while(min_heap.size()){
	 	long long  mind=min_heap.begin() ->first;
	 	long long  v=min_heap.begin() ->second;
	 	min_heap.erase(min_heap.begin());
	 	for(long long  i=0;i<G[v].size();i++){
	 		if(d[G[v][i].v]>d[v]+G[v][i].w) {
	 			min_heap.erase(make_pair(d[G[v][i].v],G[v][i].v));
	 			d[G[v][i].v]=d[v]+G[v][i].w;
				min_heap.insert(make_pair(d[G[v][i].v],G[v][i].v));
			 }
		 }
	 }
	 long long  ans=0;
	 for(long long  i=0;i<z;i++){
	 	if(d[i]<=h){
	 		ans+=(h-d[i])/z+1;
		 }
	 }
	 cout<<ans;
}
2022/1/17 23:14
加载中...