JZOJ4722 跳楼机 巧妙地转换为最短路模型
2016-08-21 14:41
323 查看
题目大意
有一个H高的楼房,现在给你三个正整数x,y,z表示,在每一层i,你有4种选择,到i+x,i+y,i+z层或第1层。问能到多少个楼层。H≤1018
x,y,z≤105
解题思路
也就是说有多少p=ax+by+cx(p≤H)我们可一考虑一种一种操来做,假设我们一开始用前两个操作到了第i层,然后后面全部用第三种操作,那么对答案的贡献就是⌊H−iz⌋。但是会用算重的情况,那么我们考虑用一种不会算重的方法来统计答案,设Fi(i∈[0,z))表示在用前两个数能到达最小的位置Fi,满足Fimodz=i,那么最后的答案就是∑z−1i=0(⌊H−Fiz⌋+1)。那么关键就是如何求出F数组。那么我们考虑x和y在F数组上的转移,不难发现:
F(i+y)modz=Fi+y
F(i+z)mod(z)=Fi+z
那么我们把这两个点之间连边,跑一次SPFA就能得到F数组了。
程序
我的程序与上面说的有点不一样,Disi表示达到j位置最小的块是哪一块(每z分一块)//YxuanwKeith #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; typedef long long LL; const int MAXN = 5e5 + 5; LL H, Dis[MAXN], Ans; bool Flag[MAXN]; int S[3], D[MAXN]; int tot, Last[MAXN], Go[MAXN * 2], Len[MAXN * 2], Next[MAXN * 2]; void Link(int u, int v, int Dis) { Next[++ tot] = Last[u], Last[u] = tot, Go[tot] = v, Len[tot] = Dis; } void MakeRoad(int x, int y) { int Dis = y / x, Lef = y % x; for (int i = 0; i < x; i ++) Link(i, (i + Lef) % x, Dis + (i + Lef > x - 1)); } void Spfa() { memset(Dis, 60, sizeof Dis); int l = 0, r = 1; Dis[0] = 0, D[1] = 0; while (l != r) { l = (l + 1) % MAXN; int Now = D[l]; for (int p = Last[Now]; p; p = Next[p]) { int v = Go[p]; if (Dis[v] > Dis[Now] + Len[p]) { Dis[v] = Dis[Now] + Len[p]; if (!Flag[v]) { Flag[v] = 1; r = (r + 1) % MAXN; D[r] = v; } } } Flag[Now] = 0; } } void Prepare() { sort(S, S + 3); int x = S[0], y = S[1], z = S[2]; H --; MakeRoad(x, y); MakeRoad(x, z); Spfa(); } void Solve() { int x = S[0]; for (int i = 0; i < x; i ++) Ans += max((H / x) + ((H % x) >= i) - Dis[i], 0ll); printf("%lld\n", Ans); } int main() { scanf("%lld", &H); scanf("%d%d%d", &S[0], &S[1], &S[2]); Prepare(); Solve(); }
相关文章推荐
- Tomcat+Cas整合SSO
- 2016多校10 HDU 5858 Hard problem
- Manacher算法
- OpenCV实现图像颜色特征提取
- 使用 iframe 引用优酷和土豆和腾讯视频,支持 HTML5 手机 播放
- Codeforces 707A Brain‘s photos
- ssm整合
- View 和ViewGroup
- 【cj】
- 【挖坑记】JZOJ 4706
- hihocoder 1364 奖券兑换
- 学习笔记5——CentOS_x86_64操作系统的生产标准基础优化命令
- jzoj 2041. 【2016.5.21普及组模拟】魔方工厂
- hihocoder1363 图像算子
- #368 (Div. 2) B. Bakery
- hihocoder 1362 修补木桶
- 堆优化的Dijkstra
- hibernate主配置文件配置流程。
- codeforces 707B Bakery(最小生成树)
- eclipse中集成hadoop插件以及远程调试hadoop的resourcemanager