vijos 1054 牛场围栏 【想法题】
这题刚看完后第一个想到的方法是背包 但仔细分析数据范围后会发现这题用背包做复杂度很高
比如对于这样的数据
2 100
2999
2898
(如果有神犇可以用背包过掉这样的数据 请回复下背包的做法)
-----------------------------------------------------------------------------------
在翻看了vijos上自带题解区后 会发现有些人提到了最短路
设最后可用木料中最短的长度为$L0$ 则显然若长度X可以得到 那么长度$X+L0$也可以得到
所以我们可以研究下在$modL0$的意义下 每种长度至少要为多长可以得到
设所有可得到的长度最小值中的最大值为$Y$ 那么$Y-L0$即为最后的答案
由于建图已经是$O(L^2)$了 因此求最短路的时候直接写不加堆优化的dijkstra总复杂度也是$O(L^2)$的
具体实现以及细节处理可参考代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define imax(x,y) (x>y?x:y)
#define imin(x,y) (x<y?x:y)
using namespace std;
const int L=;
int firste[L],nexte[L*L],v[L*L],w[L*L];
int dist[L],num[L];
bool color[L],used[L];
int n,m,e=,low=,top=,cnt=;
bool flag=;
void build_edge(int x,int y,int z)
{
++e;
nexte[e]=firste[x];
firste[x]=e;
v[e]=y;
w[e]=z;
}
int gcd(int x,int y)
{
if(!y)return x;
return gcd(y,x%y);
}
bool check(int x)
{
if(x==low)return ;
int tx=x%low;
while(tx<x)
{
if(color[tx])return ;
tx+=low;
}
return ;
}
int main()
{
int x,ans=;
scanf("%d%d",&n,&m);
rep(i,n)
{
scanf("%d",&x);
if(x-m<=)
{
printf("-1");
return ;
}
low=imin(low,x-m);
top=imax(top,x);
for(int j=x-m;j<=x;++j)
color[j]=;
}
for(int i=;i<=top;++i)
if(color[i])
num[++cnt]=i;
for(int i=;i<cnt;++i)
{
for(int j=i+;j<=cnt;++j)
if(gcd(num[i],num[j])==)
{
flag=;
break;
}
if(flag)break;
}
if(!flag)
{
printf("-1");
return ;
}
rep(i,cnt)
if(check(num[i]))
{
int z=num[i]/low;
for(int j=;j<low;++j)
{
int y=(j+num[i])%low;
if(y>j)
build_edge(j,y,z);
else
build_edge(j,y,z+);
}
}
memset(dist,,sizeof(dist));
dist[]=;
for(int i=;i<low;++i)
{
int u=low;
for(int j=;j<low;++j)
if(!used[j]&&dist[j]<dist[u])u=j;
used[u]=;
for(int p=firste[u];p;p=nexte[p])
if(dist[v[p]]>dist[u]+w[p])
dist[v[p]]=dist[u]+w[p];
}
for(int i=;i<low;++i)
ans=imax(ans,(dist[i]-)*low+i);
printf("%d",ans);
return ;
}
另外 vijos1065 的思路也与此类似 只不过更加直接了
vijos 1054 牛场围栏 【想法题】的更多相关文章
- HDU 4972 Bisharp and Charizard 想法题
Bisharp and Charizard Time Limit: 1 Sec Memory Limit: 256 MB Description Dragon is watching NBA. He ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- LG2662 牛场围栏 和 test20181107 数学题
P2662 牛场围栏 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后 ...
- luoguP3951 小凯的疑惑/P2662 牛场围栏
其实就是当年sxy给我讲的墨墨的等式,只是当时比较菜听得似懂非懂. 小凯的疑惑 去年noipday1t1,当时随便猜了个结论结果猜对了,现在瞎证一下,答案是a*b-a-b. 设a为a,b中较小的一个, ...
- 【同余最短路】洛谷 P2662 牛场围栏
关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...
- 牛场围栏(vijos 1054)
题目大意: 给出N种木棍(每种木棍数量无限)的长度(<=3000),每根木棍可以把它切掉[1,M]的长度来得到新的木棍. 求最大的不能被组合出来的长度. 如果任何长度都能组合出来或者最大值没有上 ...
- HDU - 5969 最大的位或 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
随机推荐
- Netty核心组件介绍及手写简易版Tomcat
Netty是什么: 异步事件驱动框架,用于快速开发高i性能服务端和客户端 封装了JDK底层BIO和NIO模型,提供高度可用的API 自带编码解码器解决拆包粘包问题,用户只用关心业务逻辑 精心设计的Re ...
- 浏览器调起摄像头(jquery+layui)
/* 实例化camvas配置参数 config = { video:{width:Number(scale*4),height:Number(scale*3)},//视频比例4:3 canvasId: ...
- Day9---Python的集合类
集合类 1.生成办法: 可使用{.....} 或者set()生成集合,例如 a = {23,214,34,324,234,34} #这里的集合就是数学上的集合a = set('dsfasfsdf') ...
- python模块 __name=='__main__' 用法
python模块 __name=='__main__' 用法1.ceshi_mod1.pydef test1(): print('111111')def test2(): print('2222')i ...
- 如何为自己的网站添加HTTPS服务
如何为自己的网站添加HTTPS服务,针对单个域名而言的,下面介绍网站添加https方法,拿阿里云方法 1.准备证书文件 进入阿里云管理控制台-安全-证书服务点击购买证书服务,进入证书购买页面(放心,我 ...
- k3 cloud总账凭证点击保存的时候提示未将对象引用到对应的实例
检查以后发现是创建日期的用了创建日期,修改了一下日期就可以了
- Intellij CodeComplete
code-complete change to ALT + /
- 从零开始之uboot、移植uboot2017.01(一、移植前的准备)
手边的是一个S5PV210的开发板,想尝试移植一个比较新的uboot 下载最新版本uboot2018. ftp://ftp.denx.de/pub/u-boot/ 编译器下载 http://www.v ...
- [BZOJ5305] [HAOI2018] 苹果树 数学 组合计数
Summary 题意很清楚: 小 \(C\) 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 \(C\) 发现每一天这棵树都会生长出一个新的结点. 第一天的时候 ...
- Ubuntu查看和自动挂载硬盘
sudo blkid 查看UUID vim /etc/fstab 进行修改 如果 fstab 文件中的命令挂载的硬盘不存在,启动的时候会报错.