P2662 牛场围栏

思路

假设我们已经知道同余最短路是什么了,这里就不再过多赘述。

我们要尽可能地得到更多地课建成地边,那么我们必然要选一个basebasebase相对小的,因此我们可以对所有的棍子排个序,然后取a[1]−ma[1] - ma[1]−m作为我们选取的basebasebase。

接下来就是考虑建边了,参考这篇博客,我们对所有的可能的边都建立一条与basebasebase同余的边,即

for(int i = 1; i < n; i++)for(int j = 0; j < base; j++)for(int k = a[i] - m; k <= a[i]; k++)add(j, (j + k) % base, k)// from, to, value;

接下来就是跑一遍spfa∣∣dijkstraspfa||dijkstraspfa∣∣dijkstra,得到我们的disdisdis数组。这里我再说明一下disdisdis数组的含义:

eg.dis[i]=xeg. dis[i] = xeg.dis[i]=x表示的是x≡i(modbase)x \equiv i \pmod {base}x≡i(modbase),xxx是满足要求的最小值。

所以当进行答案的统计的时候,如果发现有disdisdis数组没有被访问过,说明有若干同余的围栏是不可能得到的,这个时候没有最大值。否则的话,我们的答案将会是,所有disdisdis数组中dis−basedis - basedis−base的最大值,原因就在上面disdisdis数组所讲诉的含义。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define endl '\n'using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}void print(ll x) {if(x < 10) {putchar(x + 48);return ;}print(x / 10);putchar(x % 10 + 48);
}const int N = 3e3 + 10;int n, m, a[N];bool visit[N];ll dis[N];
vector<pii> G[N];void spfa() {memset(dis, 0x3f, sizeof dis);queue<int> q;q.push(0);visit[0] = 1, dis[0] = 0;while(q.size()) {auto temp = q.front();q.pop();visit[temp] = 0;for(auto i : G[temp]) {if(dis[i.first] > dis[temp] + i.second) {dis[i.first] = dis[temp] + i.second;if(!visit[i.first]) {q.push(i.first);visit[i.first] = 1;}}}}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), m = read();for(int i = 1; i <= n; i++) a[i] = read();sort(a + 1, a + 1 + n);if(a[1] - m <= 1) {puts("-1");return 0;}int base = a[1] - m;for(int i = 1; i <= n; i++) {for(int j = 0; j < base; j++) {for(int k = a[i] - m; k <= a[i]; k++) {G[j].pb(mp((j + k) % base, k));}}}spfa();ll ans = 0;for(int i = 1; i < base; i++) {if(dis[i] == 0x3f3f3f3f3f3f3f3f) {puts("-1");return 0;}ans = max(ans, dis[i] - base);}cout << ans << endl;return 0;
}

P2662 牛场围栏(同余最短路)相关推荐

  1. 【算法笔记】一步一步推出来的同余最短路优化思路(千字长文,超详细)

    整理的算法模板合集: ACM模板 目录 同余最短路 例题1:luogu P3403 跳楼机 例题2:luogu P2371 [国家集训队]墨墨的等式 例题3:luogu P2662 牛场围栏 同余最短 ...

  2. 【NOIP模拟题】【DP】【同余最短路】【暴力剪枝】2016.11.15 第二题 小L的牛栏 题解

    小L的牛栏 [题目描述] 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后,凭着 ...

  3. 牛客 - Yuki with emofunc and playf(同余最短路)

    题目链接:点击查看 题目大意:初始时给出一个数字 y=1y=1y=1 和一个辅助数字 xxx,每回合可以执行两种操作中的一种: y=y∗10y=y*10y=y∗10 y=y+x−1y=y+x-1y=y ...

  4. 同余最短路(P3403 跳楼机)

    同余最短路 前置 给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法. P3403 跳楼机 ...

  5. 湖南大学第十六届程序设计竞赛 B Yuki with emofunc and playf 同余最短路

    传送门 文章目录 题意: 思路: 题意: 初始有一个数111,你每次可以将其∗10*10∗10或者+(x−1)+(x-1)+(x−1),现在给你xxx,问最少经过多少步能到达nnn. 1≤n≤1e6, ...

  6. HDU - 6071 Lazy Running 同余最短路 + 分层

    传送门 题意: 给定四个点构成一个环,给出四个点之间的距离,让后从222号点出发,最终回到222号点,求经过的距离>=k>=k>=k的最小距离. 思路: 由于从222开始,最终在22 ...

  7. P2371 [国家集训队]墨墨的等式 同余最短路

    传送门 题意: 思路: 一个同于最短路的板子题,初始的时候值为0,所以设dis[0]=0dis[0]=0dis[0]=0,让后选择一个最小的a[i]a[i]a[i]作为basebasebase,跑一遍 ...

  8. 【学习笔记】同余最短路

    同余最短路是用来解决一类 ∑i=1naixi∈[L,R]\sum_{i=1}^n a_ix_i\in[L,R]∑i=1n​ai​xi​∈[L,R] 问题的方法. 其中 L,RL,RL,R 值非常大,而 ...

  9. P2371 [国家集训队]墨墨的等式 ——同余最短路

    P2371 思路 同余最短路,自我感觉做这类题要注意两点. 1.虽然n的范围很小,但实际建图的点的数量为min{a_i} =5e5,边的数量为n∗ain * a_in∗ai​即12*5e5. 2.和上 ...

最新文章

  1. 计算机专业知识考试 一,计算机专业知识试题(事业单位计算机专业知识考试试卷)(1)...
  2. idea permission denied 权限分配问题解决方案
  3. batch normalization的原理和作用_springboot自动配置原理
  4. 浏览器生成消息-探索浏览器的内部(1)
  5. ADS2017打开出现cannot create the directory,解决办法。
  6. BZOJ(8) 1053: [HAOI2007]反素数ant
  7. Android 省,市,区选择权
  8. P3332-[ZJOI2013]K大数查询【树套树】
  9. 英语中十二个月名称的由来
  10. 信息学奥赛一本通 2057:【例3.9 】星期几
  11. socket编程(二) select 模型
  12. NetBeans+xdebug解决无法连接xdebug问题
  13. Python写数据结构:循环队列
  14. python如何可视化编辑gui_python gui,python可视化窗口编程
  15. 实习周记---20180527
  16. java基础 -- Apache POI将PPT转换成图片
  17. 数据库原理及应用 mysql版_数据库原理及应用(MySQL版)
  18. [容斥 状压DP] Atcoder ARC093 F - Dark Horse
  19. 500以内降噪蓝牙耳机推荐,2023年热门降噪蓝牙耳机推荐
  20. 开发润乾报表过程:因为内容过多分页导致的这条线

热门文章

  1. lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
  2. 把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?
  3. 浅析 Sunday 算法
  4. 现在银行etl还要做拉链表吗_hive 拉链表 实现全量数据 增量更新
  5. 没找到rpm命令_Mysql的命令总结和PyMysql
  6. php 覆盖相同键的值,php - PHP数组使用相同的字符串键组合值 - SO中文参考 - www.soinside.com...
  7. matlab提示未定义wc,WooCommerce 教程:修复致命错误调用未定义的函数wc_get_order() - WooCommerce 微站...
  8. oracle 查看用户状态,Oracle数据库查看用户状态
  9. mfc 找到字符串中字符_[LeetCode] 467. 环绕字符串中唯一的子字符串
  10. case when影响性能吗_字段为NULL会影响查询性能吗?