[题目链接]

https://loj.ac/problem/539

[算法]

首先 , 我们用f[u][k]表示现在在景点u ,还有k元钱 , 最多能够走多少路

不难发现f[u][k] = max{ f[v][k - P[u]] + Dist(u,v,min(C,ci)) } ( dist(u,v,w)表示从u走到v , 最多经过w条路 , 最多能走多少路 )

用倍增弗洛伊德求dist, 然后进行上述dp , 即可

时间复杂度 : O(N^4 + N^3logN + TlogQ)

[代码]

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int inf = 1e9;
  4. #define MAXN 110
  5. #define MAXLOG 20
  6.  
  7. int n,m,C,T,tot;
  8. int head[MAXN];
  9. int a[MAXN],b[MAXN],p[MAXN],c[MAXN];
  10. int dis[MAXN][MAXN],f[MAXN][MAXN * MAXN];
  11. int mat[MAXLOG][MAXN][MAXN];
  12.  
  13. template <typename T> inline void read(T &x)
  14. {
  15. T f = ; x = ;
  16. char c = getchar();
  17. for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
  18. for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
  19. x *= f;
  20. }
  21.  
  22. int main()
  23. {
  24.  
  25. read(n); read(m); read(C); read(T);
  26. for (int i = ; i <= n; i++)
  27. {
  28. read(p[i]);
  29. read(c[i]);
  30. c[i] = min(c[i],C);
  31. }
  32. for (int i = ; i <= n; i++)
  33. {
  34. for (int j = ; j <= n; j++)
  35. {
  36. if (i != j)
  37. mat[][i][j] = -inf;
  38. }
  39. }
  40. for (int i = ; i <= m; i++)
  41. {
  42. int u,v,w;
  43. read(u); read(v); read(w);
  44. mat[][u][v] = max(mat[][u][v],w);
  45. }
  46. for (int i = ; i < MAXLOG; i++)
  47. {
  48. memcpy(mat[i],mat[i - ],sizeof(mat[i]));
  49. for (int k = ; k <= n; k++)
  50. {
  51. for (int x = ; x <= n; x++)
  52. {
  53. for (int y = ; y <= n; y++)
  54. {
  55. if (mat[i - ][x][k] != -inf && mat[i - ][k][y] != -inf)
  56. mat[i][x][y] = max(mat[i][x][y],mat[i - ][x][k] + mat[i - ][k][y]);
  57. }
  58. }
  59. }
  60. }
  61. for (int i = ; i <= n; i++)
  62. {
  63. for (int x = ; x <= n; x++) a[x] = -inf;
  64. a[i] = ;
  65. for (int k = ; k < MAXLOG; k++)
  66. {
  67. if (c[i] & ( << k))
  68. {
  69. for (int x = ; x <= n; x++) b[x] = -inf;
  70. for (int x = ; x <= n; x++)
  71. {
  72. for (int y = ; y <= n; y++)
  73. {
  74. b[y] = max(b[y],a[x] + mat[k][x][y]);
  75. }
  76. }
  77. memcpy(a,b,sizeof(a));
  78. }
  79. }
  80. for (int j = ; j <= n; j++) dis[i][j] = a[j];
  81. }
  82. for (int i = ; i <= n * n; i++)
  83. {
  84. for (int j = ; j <= n; j++)
  85. {
  86. if (i < p[j])
  87. {
  88. f[j][i] = ;
  89. continue;
  90. }
  91. for (int k = ; k <= n; k++) f[j][i] = max(f[j][i],f[k][i - p[j]] + dis[j][k]);
  92. }
  93. }
  94. while (T--)
  95. {
  96. int s,q,d;
  97. read(s); read(q); read(d);
  98. if (f[s][q] < d)
  99. {
  100. printf("-1\n");
  101. continue;
  102. }
  103. int l = , r = q , mid , ans;
  104. while (l <= r)
  105. {
  106. mid = (l + r) >> ;
  107. if (f[s][mid] >= d)
  108. {
  109. ans = mid;
  110. r = mid - ;
  111. } else l = mid + ;
  112. }
  113. printf("%d\n",q - ans);
  114. }
  115.  
  116. return ;
  117.  
  118. }

[LibreOJ NOIP Round #1] 旅游路线的更多相关文章

  1. [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp

    「LibreOJ NOIP Round #1」旅游路线 题目链接:https://loj.ac/problem/539 题解: 这个题就很神奇 首先大力$dp$很好想,因为可以把一维放到状态里以取消后 ...

  2. 「LibreOJ NOIP Round #1」旅游路线

    Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...

  3. LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)

    哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...

  4. 【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线

    [题意]给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数. n<=100,m<=1000, ...

  5. LOJ#539. 「LibreOJ NOIP Round #1」旅游路线

    n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...

  6. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

  7. 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线

    description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...

  8. LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线

    题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...

  9. 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推

    [题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...

随机推荐

  1. JavaScript 中实现 sleep

    来自推特上 Windows 故障分析的笑话 图片来源:me.me 推上看到的笑话,Windows 故障分析的实现. 然后想起来 JavaScript 中如何实现这个 sleep() 函数让代码暂停指定 ...

  2. 【转载】原 IntelliJ IDEA (idea)引入eclipse web项目

    原文地址:http://my.oschina.net/u/1170781/blog/192731 摘要 概述IntelliJ IDEA,以后都简称为idea,鼓捣了很久,看了很多例子才搞出来,希望对其 ...

  3. Mkdocs在html网页上看markdown

    目录 Mkdocs在html网页上看markdown 1. 本文目的 2. Mkdocs介绍 3. DEMO的演示 3.1 配置需求 3.2 安装mkdocs 3.3 新建工程 3.4 启动服务器 3 ...

  4. JPA 与 JDBC 的区别和基本用法

    JPA 概念 JPA(Java Persistence API)用于对象持久化的 API,是 Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层. 与 JDBC 的对 ...

  5. LeetCode_16 3SumCloest

    3Sum Closest Given an array nums of n integers and an integer target, find three integers in nums su ...

  6. DH密钥交换算法

    DH密钥交换算法:DH的全称为Diffie-Hellman ,该算法可以在需要安全传输的前提下,确定双方的对称密钥,该算法的核心在于双方的私钥没有进入网络传输流程,根据对方的公钥和己方的私钥,可以计算 ...

  7. css--小白入门篇1

    一.引入 css用来描述html,学习css前我们先来学习html的基础标签的用法,再进入css的学习. 本教程面向小白对象,不会讲细枝末节深入的东西. 二.列表 列表有3种 2.1 无序列表 无序列 ...

  8. Unity对象的所有组件深拷贝与粘贴

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51454847 作者:car ...

  9. 关于pom.xml中的dependency中的顺序

    特别注意: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>l ...

  10. https://blog.csdn.net/zhi_sheng/article/details/78910082----mybatis写当天 当月的数据 时间段数据

    https://blog.csdn.net/zhi_sheng/article/details/78910082---- mybatis写当天 当月的数据 时间段数据