当前位置: 首页 > news >正文

《P3403 跳楼机》

题目背景

DJL 为了避免成为一只咸鱼,来找 srwudi 学习压代码的技巧。

题目描述

Srwudi 的家是一幢 h 层的摩天大楼。由于前来学习的蒟蒻越来越多,srwudi 改造了一个跳楼机,使得访客可以更方便的上楼。

经过改造,srwudi 的跳楼机可以采用以下四种方式移动:

  1. 向上移动 x 层;
  2. 向上移动 y 层;
  3. 向上移动 z 层;
  4. 回到第一层。

一个月黑风高的大中午,DJL 来到了 srwudi 的家,现在他在 srwudi 家的第一层,碰巧跳楼机也在第一层。DJL 想知道,他可以乘坐跳楼机前往的楼层数。

输入格式

第一行一个整数 h,表示摩天大楼的层数。

第二行三个正整数,分别表示题目中的 x,y,z。

输出格式

一行一个整数,表示 DJL 可以到达的楼层数。

输入输出样例

输入 #1复制

15
4 7 9

输出 #1复制

9

输入 #2复制

33333333333
99005 99002 100000

输出 #2复制

33302114671

说明/提示

可以到达的楼层有:1,5,8,9,10,12,13,14,15。

1≤h≤263−1,1≤x,y,z≤105。

代码实现:

#include<bits/stdc++.h>
#define int long long
int head[2000005],edgeCount;
struct EdgeData{
int target;
int next;
int weight;
};
EdgeData edges[2000005];
void addEdge(int fromNode,int toNode,int weight) {
edgeCount++;
edges[edgeCount].target=toNode;
edges[edgeCount].weight=weight;
edges[edgeCount].next=head[fromNode];
head[fromNode]=edgeCount;
}
int distance[1000005];
bool visited[1000005];
struct QueueNode{
int distance;
int position;
bool operator < (const QueueNode &x) const {
return x.distance < distance;
}
};
std::priority_queue<QueueNode> priorityQueue;
void dijkstra(int start) {
memset(distance,0x3f,sizeof(distance));
distance[start]=0;
priorityQueue.push((QueueNode){0,start});
while(!priorityQueue.empty()) {
QueueNode current=priorityQueue.top();
priorityQueue.pop();
int currentNode=current.position;
if(visited[currentNode]) continue;
visited[currentNode]=1;
for(int i=head[currentNode];i;i=edges[i].next) {
int nextNode=edges[i].target;
if(distance[nextNode]>distance[currentNode]+edges[i].weight) {
distance[nextNode]=distance[currentNode]+edges[i].weight;
priorityQueue.push((QueueNode){distance[nextNode],nextNode});
}
}
}
}
int maxHeight,modValue,stepY,stepZ,result=0;
signed main() {
std::cin>>maxHeight>>modValue>>stepY>>stepZ;

//特判
if(modValue==1 || stepY==1 || stepZ==1) {
std::cout<<maxHeight;
return 0;
}
maxHeight--;
//建图
for(int i=0;i<modValue;i++) {
addEdge(i,(i+stepZ)%modValue,stepZ);
addEdge(i,(i+stepY)%modValue,stepY);
}
dijkstra(1);
for(int i=0;i<modValue;i++) {
if(maxHeight>=distance[i]) result+=(maxHeight-distance[i])/modValue+1;
//注意这个地方要多加一条判断
}
std::cout<<result;
return 0;
}

http://www.dtcms.com/a/323865.html

相关文章:

  • 搭建本地 Git 服务器
  • Beelzebub靶机攻略
  • 昼夜节律修复方案(2025.08.10-08.17)
  • 基于python高校固定资产管理系统
  • vue3项目中在一个组件中点击了该组件中的一个按钮,那么如何去触发另一个组件中的事件?
  • 计算机网络:(十四)传输层(下)详细讲解TCP报文段的首部格式,TCP 可靠传输的实现与TCP 的流量控制
  • 纳维 - 斯托克斯方程的存在性与光滑性:流体世界的千年谜题
  • Dify集成 Echarts 实现智能数据报表集成与展示实战详解
  • 【东枫科技】FR2/FR3 毫米波原型开发平台
  • ubuntu 安装内核模块驱动 DKMS 介绍
  • 基于Ubuntu20.04的环境,编译QT5.15.17源码
  • 瑞芯微 RK3588 平台驱动开发 学习计划
  • Ubuntu 22.04 离线环境下完整安装 Anaconda、CUDA 12.1、NVIDIA 驱动及 cuDNN 8.9.3 教程
  • 设计模式(Design Pattern)
  • vue和react和uniapp的状态管理分别是什么,并且介绍和怎么使用
  • FreeRTOS 任务与中断函数:运行机制、关键区别与使用准则
  • 如何利用RabbitMQ延迟消息优化电商支付
  • MPLS特性之PHP(Penultimate Hop Popping)
  • Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏
  • 从神经网络语言模型(NNLM)到Word2Vec:自然语言处理中的词向量学习
  • NLP——TF-IDF算法
  • WebAssembly技术详解:从浏览器到云原生的高性能革命
  • 麒麟系统播放 pptx
  • Spring MVC 九大组件源码深度剖析(二):LocaleResolver - 国际化背后的调度者
  • 集成电路学习:什么是Parameter Server参数服务器
  • 【软件测试】BUG篇 — 详解
  • 从 `unittest` 到 `pytest`:探寻 Python 测试框架的优雅进化与社区选择*
  • Java 后端性能优化实战:从 SQL 到 JVM 调优
  • Spring 依赖注入、AOP代理
  • GC如何判断对象可以被回收?