JZOJ_4722. 跳楼机 (Standard IO)

Description

 
DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧。
Srwudi的家是一幢h层的摩天大楼。由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼。
经过改造,srwudi的跳楼机可以采用以下四种方式移动:
1、向上移动x层;
2、向上移动y层;
3、向上移动z层;
4、回到第一层。
一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层。DJL想知道,他可以乘坐跳楼机前往的楼层数。

Input

第一行一个整数h,表示摩天大楼的层数。
第二行三个正整数,分别表示题目中的x, y, z。

Output

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

Solution

直接BFS,状态太多,我们考虑减少状态。
记di=c,表示在满足c mod x=i的前提下,仅通过第二和第三个操作可以到达的最小楼层c。
如果我们得到di,那么最后的答案就是
对于di的计算,我们有如下两种形式的转移
d(i+y) mod x=di+y
d(i+z) mod x=di+z
不难发现,这就是一个最短路模型,直接上SPFA。

代码

 1 type
 2   arr=record
 3     y,next,w:longint;
 4   end;
 5 var
 6   n,ans:int64;
 7   nm,xx,yy,zz:longint;
 8   a:array [0..200001] of arr;
 9   ls,list,v:array [0..100001] of longint;
10   d:array [0..100001] of int64;
11 procedure add(x,y,z:longint);
12 begin
13   inc(nm);
14   a[nm].y:=y; a[nm].w:=z;
15   a[nm].next:=ls[x]; ls[x]:=nm;
16 end;
17
18 procedure init;
19 var
20   i,t:longint;
21 begin
22   fillchar(ls,sizeof(ls),255);
23   readln(n);
24   readln(xx,yy,zz);
25   if xx<yy then
26     begin
27       t:=xx; xx:=yy; yy:=t;
28     end;
29   if xx<zz then
30     begin
31       t:=xx; xx:=zz; zz:=t;
32     end;
33   nm:=0;
34   for i:=0 to xx-1 do
35     begin
36       add(i,(i+yy) mod xx,yy);
37       add(i,(i+zz) mod xx,zz);
38     end;
39 end;
40
41 procedure spfa;
42 var
43   i,tail,head,x:longint;
44 begin
45   for i:=0 to 100001 do
46     d[i]:=9223372036854675807;
47   fillchar(v,sizeof(v),0);
48   head:=0; tail:=1;
49   list[1]:=1; d[1]:=1; v[1]:=1;
50   repeat
51     inc(head); x:=list[head];
52     i:=ls[x];
53     while i<>-1 do
54       with a[i] do
55         begin
56           if d[x]+w<d[y] then
57             begin
58               d[y]:=d[x]+w;
59               if v[y]=0 then
60                 begin
61                   inc(tail);
62                   list[tail]:=y;
63                   v[y]:=1;
64                 end;
65             end;
66           i:=next;
67         end;
68     v[list[head]]:=0;
69   until head>tail;
70 end;
71
72 procedure print;
73 var
74   i:longint;
75 begin
76   ans:=0;
77   for i:=0 to xx-1 do
78     if n-d[i]>=0 then
79       ans:=ans+(n-d[i]) div xx+1;
80   writeln(ans);
81 end;
82
83 begin
84   init;
85   spfa;
86   print;
87 end.

原文地址:https://www.cnblogs.com/zyx-crying/p/9520204.html

时间: 2024-07-28 15:23:00

JZOJ_4722. 跳楼机 (Standard IO)的相关文章

[spfa] Jzoj P4722 跳楼机

Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方便的上楼.经过改造,srwudi的跳楼机可以采用以下四种方式移动:1.向上移动x层:2.向上移动y层:3.向上移动z层:4.回到第一层.一个月黑风高的大中午,DJL来到了srwudi的家,现在他在srwudi家的第一层,碰巧跳楼机也在第一层.DJL想知道,他可以乘坐跳楼机前往的楼层数. Input 第

题解:序列 (Standard IO)

题解 序列 (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits Description Fiugou想要在一个长度为N的序列A中找到不同位置的三个数,以这三个数为三边长来构成一个三角形.但是它希望在满足条件下,这三个数的位置尽量靠前.具体地,设这三个数的为Ai,Aj,Ak(i<j<k), Fiugou希望k尽量小:当k相等时,满足j尽量小:当k,j均相等时,满足i尽量小.但是这个序列中的数可

Luogu P3403 跳楼机|同余最短路

题意:给出跳楼机的4个操作,分别为 1.向上移动\(x\)层: 2.向上移动\(y\)层: 3.向上移动\(z\)层: 4.回到第一层. 显然,并不需要 求从第一层开始,能到达\(1\)到\(h\)中的多少层? \(1<=h<=2^{63}-1\) \(1<=x, y, z<=100000\) 题解: 好像可以直接\(DP\)? 布星啊,看下数据范围. 那先来推推定理? 接下来假设\(x\le y\le z\) 对于一个数\(k\),若它能到达,则\(k+x,k+2x,k+...\

NOI-CCF 1123. A-B (Standard IO)

题目描述 给定N个数Ai,以及一个正整数C,问有多少对i,j,满足Ai-Aj=C. 输入 第一行输入两个空格隔开的整数N和C第2至N+1行每行包含一个整数 A_i 输出 输出一个数表示答案. 样例输入 5 3 2 1 4 2 5 样例输出 3 数据范围限制 N <= 200000,所有数字保证在32位有符号整型内. 1 /* 2 由于a[i]-a[j]=c; 3 我们希望找的就是序列中A[i]+C的个数. 4 我们可以先求出A中小于等于A[i]+C的数的个数. 5 再求出A中小于等于A[i]+C

JZOJ #4722 跳楼机

题目描述: 给出h.x.y.z,求在h以内,x.y.z可以凑出多少个不同的数. (1≤h≤10^18,1≤x, y, z≤10^5.) 解题思路: 直接做显然不好做.我们考虑取n个y和m个z,然后再加上x.2 * x.3 * x...,显然地,只要对于每种取法,(ny + mz) % x 的值不同的话,就不会有重复.所以我们先求出 d[i] = c 表示通过选y和z使得和模x等于i的最小和c.然后答案就是 ∑0≤i<x (h - d[i]) / x + 1.至于怎么求d[i],可以发现 d[(i

[Luogu3403]跳楼机

luogu 题意 其实就是给你三个数\(x,y,z\),问你能够凑出多少个\([1,h]\)之间的数. \(1\le h \le 2^{63}-1\),\(1\le x,y,z \le 10^5\) sol 用\(y,z\)凑出的在模\(x\)意义下相同的数一定是越小越好. 所以可以写一个最短路求出用\(y,z\)凑出的在模\(x\)意义下为\(i\)的最小的数,记为\(f_i\),那么模意义下为\(i\)的所有数的总贡献就是\[\lfloor\frac{h-f_i}{x}\rfloor+1\

JZOJ_3223. 【HBOI2013】Ede的新背包问题 (Standard IO)

Description  “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎么的心情.能不能说给我听.” 失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她的音容笑貌. 记忆中,她总是喜欢给Eden出谜题,在valentine's day的夜晚,两人在闹市中闲逛时,望着礼品店里精巧玲珑的各式玩偶,她突发奇想,问Eden这样的一个问题:有n个玩偶,每个玩偶有对应的价值.价钱,每个玩偶都可以被买有限次,在携带的价钱m固定的情款下,如何选择买哪些玩偶以及每

JZOJ 4230. 淬炼神体 (Standard IO)

题目 Description 王仙女将你提供的答案填在<葵花宝典>上,突然,宝典发出耀眼的白光,一股强大的吸力瞬间将仙女吸入宝典中.一阵眩晕过后,仙女发现自己来到了一个浮岛上,四周的半空中也有许多大小不一的浮岛,他抬头一看,空中浮现着这样一句话:欲要成神,必先成就神体.每座浮岛都有一定的淬炼肉体的功效,但你只能选择恰好K座来淬炼你的肉体.最终你的神体有多强,就看你的造化了.仙女看了看手中的宝典,发现上面浮现着这些浮岛的信息,每座浮岛上有两个数字.仙女研究了一会儿终于明白了,原来,每来到一座浮岛

2644. 数列 (Standard IO)

这道题是道数论题,如果想对了的话会很快. 因为这道题实在是没有什么知识点,所以我直接上代码,代码上有很详细的注释: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1000005]={0},t; //a为桶排序数组 int main(){ std::ios::sync_with_stdio(0);//读入输出加速 cin>>t;//测试数据的个数