【同余最短路】洛谷 P2662 牛场围栏
关于同余最短路的部分 【同余最短路】P3403跳楼机/P2371墨墨的等式
【P2662牛场围栏】
题目背景
小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文,
成功报送了叉院(羡慕不?)。勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后,凭着自己积累下的浓厚经济学与计算机学的基础,成功建设了一个现代化奶牛场!
题目描述
奶牛们十分聪明,于是在牛场建围栏时打算和小L斗智斗勇!小L有N种可以建造围栏的木料,长度分别是l1,l2 … lN,每种长度的木料无限。
修建时,他将把所有选中的木料拼接在一起,因此围栏的长度就是他使用的木料长度之和。但是聪明的小L很快发现很多长度都是不能由这些木料长度相加得到的,于是决定在必要的时候把这些木料砍掉一部分以后再使用。
不过由于小L比较节约,他给自己规定:任何一根木料最多只能削短M米。当然,每根木料削去的木料长度不需要都一样。不过由于测量工具太原始,小L只能准确的削去整数米的木料,因此,如果他有两种长度分别是7和11的木料,每根最多只能砍掉1米,那么实际上就有4种可以使用的木料长度,分别是6, 7,10, 11。
因为小L相信自己的奶牛举世无双,于是让他们自己设计围栏。奶牛们不愿意自己和同伴在游戏时受到围栏的限制,于是想刁难一下小L,希望小L的木料无论经过怎样的加工,长度之和都不可能得到他们设计的围栏总长度。不过小L知道,如果围栏的长度太小,小L很快就能发现它是不能修建好的。因此她希望得到你的帮助,找出无法修建的最大围栏长度。
这一定难不倒聪明的你吧!如果你能帮小L解决这个问题,也许他会把最后的资产分给你1/8哦!
输入输出格式
输入格式:
输入的第一行包含两个整数N, M,分别表示木料的种类和每根木料削去的最大值。以下各行每行一个整数li(1< li< 3000),表示第i根木料的原始长度。
输出格式:
输出仅一行,包含一个整数,表示不能修建的最大围栏长度。如果任何长度的围栏都可以修建或者这个最大值不存在,输出-1。
输入输出样例
2 1
7 11
15
说明
40 % :1< N< 10, 0< M< 300
100 % :1< N< 100, 0< M< 3000
思路
关于同余最短路的东西已经写过了,这里直接本题相关。
依然是由一些数字去凑一个数字的剩余系,这道题由于多了M的条件,需要先暴力把所有能用的数字求出来,并让其中最小的那个成为提供剩余系的x。
然后跑一遍所有能用的数字,和x的剩余系建边,最后跑最短路。
求不能凑出的最大数的时候,我们要先考虑d数组的意义。d[i]即为其他数字能凑出来的%x=i的最小数字,那么d[i]+x,d[i]+2x,d[i]+3x... d[i]以上跳所有个x都能达到。
那么%x=i的数字,最大凑不出来的就是d[i]-x。
那么很显然了,把所有的d[i]-x求出来,取其中最大值。
但是还有要注意的地方,本题存在输出-1的要求。其中一种输出-1的情况是没有凑不出来的数,那么当我们能用的木料中存在长为1的,自然就能达到所有的长度。
另一种情况是不存在这个最大值。这里有两种考虑方向,一种是求出所有数字的gcd,若其不等于1,自然有一系列没法凑出来的数字。因为能凑出来的数字一定是这个gcd的倍数,其不为一的时候必然存在凑不出来的空缺。还有一种方法是最后找ans的时候顺便看一下是否有d[i]>max(max是给d数组跑最短路前设的最大值),如果有,那么一定存在一串%x=i的数字都凑不出来。(其实这种做法大概相当于猜测利用了数据比较小)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,m;
int x,a[];
int ver[],Next[],head[],edge[],tot,d[],vis[],ans=;
queue<int>q;
void add(int x,int y,int z){
ver[++tot]=y;
Next[tot]=head[x];
edge[tot]=z;
head[x]=tot;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+,a+n+);
x=max(,a[]-m);
if(x==){
printf("-1");
return ;
}
for(int i=;i<=n;i++){
for(int j=max(a[i-]+,a[i]-m);j<=a[i];j++){
if(j!=x){
for(int k=;k<x;k++){
add(k,(k+j)%x,j);
}
}
}
}
memset(d,0x3f,sizeof(d));
d[]=;
q.push();
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=;
for(int i=head[u];i;i=Next[i]){
int v=ver[i],z=edge[i];
if(d[v]>d[u]+z){
d[v]=d[u]+z;
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
d[x]=;
for(int i=;i<x;i++){
// printf("%d %d\n",i,d[i]);
if(d[i]>){
printf("-1");
return ;
}
ans=max(ans,d[i]-x);
}
printf("%d",ans);
return ;
}
以上。
【同余最短路】洛谷 P2662 牛场围栏的更多相关文章
- 洛谷 P2662 牛场围栏
做法是这样的: 首先暴力把所有可能的边长搞出来..(当然<=0的不要) 排序边长+去重, 当且仅当可行边长里面有1时,任何长度都能取到,输出-1 当且仅当所有可行边长的gcd大于1时,不能取到的 ...
- luoguP3951 小凯的疑惑/P2662 牛场围栏
其实就是当年sxy给我讲的墨墨的等式,只是当时比较菜听得似懂非懂. 小凯的疑惑 去年noipday1t1,当时随便猜了个结论结果猜对了,现在瞎证一下,答案是a*b-a-b. 设a为a,b中较小的一个, ...
- 最短路洛谷P2384
题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...
- AC日记——最短路 洛谷 P2384
题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...
- P2384 最短路 洛谷
https://www.luogu.org/problem/show?pid=2384 题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会 ...
- luogu P2662 牛场围栏
传送门 因为一个木板可以切掉最多\(m\),所以可以先预处理哪些长度的木板可用,开个桶,然后对\([l-m,l]\)打标记,再把打了标记的数取出来 假设可用长度\(a_1,a_2,,,a_n\)从小到 ...
- LG2662 牛场围栏 和 test20181107 数学题
P2662 牛场围栏 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后 ...
- 【同余最短路】【例题集合】洛谷P3403 跳楼机/P2371 墨墨的等式
接触到的新内容,[同余最短路]. 代码很好写,但思路不好理解. 同余最短路,并不是用同余来跑最短路,而是通过同余来构造某些状态,从而达到优化时间空间复杂度的目的.往往这些状态就是最短路中的点,可以类比 ...
- 洛谷P3403跳楼机(最短路构造/同余最短路)
题目-> 解题思路: 最短路构造很神啊. 先用前两个值跑在第三个值模意义下的同余最短路(这步贪心可以证明,如果第三步长为z,那么如果n+z可以达到,n+2z同样可以达到) 最后计算与楼顶差多少个 ...
随机推荐
- Git婴幼儿使用手册【十分钟让你帅气的使用命令行和团队工作】
Git由来:...... Git使用的好处:...... 如何使用Git:(以上会显得我们以下的是很纯纯的干货) 代码库有两个部分: 本地代码库:远程代码库: 本地代码库使用方法: 一.先创建一个文件 ...
- linux 每天一个命令
Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 使用命令关闭占用80端口的程序 sudo fuser ...
- MS-coco数据集下载及使用(转)
先做个标记,改天研究下. 几个链接: MS coco数据集介绍及下载 Microsoft COCO 数据集 COCO Dataset 数据特点 COCO 数据集的使用
- vue-cli 本地环境 API 代理设置和解决跨域
前言 我们在使用 vue-cli 启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以 localhost: 来请求接口数据的,localhost 是没有办法设置 coo ...
- day70test
day_70: #api / urls: from django.conf.urls import url from . import views urlpatterns = [ url(r'^car ...
- Quota- Linux必学的60个命令
1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户. 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制. -u: ...
- goland破解
PyCharm是由著名的JetBrains公司所打造的一款功能强大的Python IDE,它具有一般IDE都具备的功能,并且使用起来非常方便好用.最近需求PyCharm激活码的网友非常多,小编就在这里 ...
- ASCII、Unicode、UTF-8 字符串和编码
字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- __name__变量
再写项目过程中,将功能函数写在 if __name=="__main__":之外,执行代码写在之中,如下:如果在foo模块打印__name__为__main__,而如果在bin模 ...
- Python开发之MySQL安装
MySQL下载安装后再安装破解版本的Navicat图形化数据库工具即可. 安装python后.再进行如下操作(也可以安装好虚拟环境virtualenv 或者增强工具pip install virt ...