洛谷 P2662 牛场围栏
做法是这样的:
首先暴力把所有可能的边长搞出来。。(当然<=0的不要)
排序边长+去重,
当且仅当可行边长里面有1时,任何长度都能取到,输出-1
当且仅当所有可行边长的gcd大于1时,不能取到的长度没有上限,输出-1
其他情况,一定有解;设最短的可行边长为x
将所有可行边长按除以x的余数分类,一类建立一个点(除以x的余数为u,则建立u点)
对于每一个可行边长y,对于每一个点u,从点u向点(u+y)%x连一条长度为y的边
可以发现从0号点向任意点u的最短路长度(dijkstra跑出来)(设为d),就是所有能取到的总长度中,除以x的余数为u的之中,最短的;且这一类(指除以x的余数为u的长度)中,所有大于d的长度也都能取到(只要加上一些长度为x的边就行了);因此,d-x就不能取到了
那么最大的不能取到的就是所有“d-x”的最大值(等于“所有d的最大值”-x)
严谨一些的证明要比noip那道复杂很多啊。。根本不会,以后再说吧
https://blog.csdn.net/Timsei/article/details/63254318
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,m;
int tt[];
priority_queue<pii,vector<pii>,greater<pii> > q;
int d[],mm=-0x3f3f3f3f;
bool vis[];
int main()
{
int i,j,u,v;pii t;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
{
scanf("%d",&u);
for(j=;j<=m;j++)
{
if(u-j<=) break;
tt[++tt[]]=u-j;
}
}
sort(tt+,tt+tt[]+);tt[]=unique(tt+,tt+tt[]+)-tt-;
if(tt[]==)
{
puts("-1");
return ;
}
int g=tt[];
for(i=;i<=tt[];i++) g=__gcd(g,tt[i]);
if(g!=)
{
puts("-1");
return ;
}
memset(d,0x3f,sizeof(d));
q.push(mp(,));d[]=;
while(!q.empty())
{
t=q.top();q.pop();
u=t.se;
if(vis[u]) continue;
vis[u]=;
for(i=;i<=tt[];i++)
{
v=(u+tt[i])%tt[];
//printf("%d %d\n",u,v);
if(d[v]>d[u]+tt[i])
{
d[v]=d[u]+tt[i];
q.push(mp(d[v],v));
}
}
}
for(i=;i<tt[];i++) mm=max(mm,d[i]);
printf("%d",mm-tt[]);
//for(i=0;i<tt[1];i++) printf("%d %d\n",i,d[i]);
return ;
}
洛谷 P2662 牛场围栏的更多相关文章
- 【同余最短路】洛谷 P2662 牛场围栏
关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...
- luoguP3951 小凯的疑惑/P2662 牛场围栏
其实就是当年sxy给我讲的墨墨的等式,只是当时比较菜听得似懂非懂. 小凯的疑惑 去年noipday1t1,当时随便猜了个结论结果猜对了,现在瞎证一下,答案是a*b-a-b. 设a为a,b中较小的一个, ...
- luogu P2662 牛场围栏
传送门 因为一个木板可以切掉最多\(m\),所以可以先预处理哪些长度的木板可用,开个桶,然后对\([l-m,l]\)打标记,再把打了标记的数取出来 假设可用长度\(a_1,a_2,,,a_n\)从小到 ...
- LG2662 牛场围栏 和 test20181107 数学题
P2662 牛场围栏 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后 ...
- 洛谷1578:[WC2002]奶牛浴场——题解
https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...
- [WC2002][洛谷P1578]奶牛浴场
洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- jmeter使用笔记——流程及常用组件配置
添加线程组 线程数 :对应用户数, Ramp-Up: 多少秒启动这些线程,1秒代表1秒内启动设置的线程数,10秒代表10秒内启动线程数 循环次数: 每个线程执行线程组内的请求循环次数 调度器:可以对线 ...
- 'gbk' codec can't encode character '\xa5' in position 4546: illegal multibyte sequence错误解决
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') 原文 http://blog.csdn.net/jim7424 ...
- 安装Nginx四层负载均衡
Nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. stream模块默认不安装的,需要手动添加参数:–with-stream,官方下载地址:downlo ...
- c++程序书写原则
1.头文件中声明类,数据变量声明为私有,函数声明为公有. 2.所有函数实现放在非main.cpp文件中. 3.main.cpp只写函数的调用接口.
- 【linux】lsof命令和{Linux下文件删除、句柄与空间释放问题}
导读: 一.用事实说话 二.关于LSOF命令的其它用法: 三.参考文档: 正文: lsof:Finding open files with lsof 作用:查看文件被哪些进程打开 一.用事实说 ...
- hdu 3507 Print Article —— 斜率优化DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...
- Nagios监控Windows的网卡流量
Nagios监控Windows的网卡流量 使用/usr/local/nagios/libexec/中的check_traffic.sh,不但可以监控Linux的网卡流量,也可以监控Windows服务器 ...
- 5.oracle中一个字段中存储'a','b'与'a'与a的写法,存储过程中与之对应
select '''a'',''b''' from dual; --'a','b' select '''a''' from dual; --'a' select 'a' from dual; --a
- 关于在项目中遇到MySQL数据库死锁的问题
在MySQL中, 当一个事务去更新某条数据, 还没有提交的时候, 第二个事务去更新该数据, 则会出现等待获取锁超时异常: >> Lock wait timeout exceeded; tr ...
- c/c++面试23-29
23 一般引用的用法 (1)代码 #include <iostream> #include <string> using namespace std; int main(int ...