这题刚看完后第一个想到的方法是背包 但仔细分析数据范围后会发现这题用背包做复杂度很高

比如对于这样的数据

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 牛场围栏 【想法题】的更多相关文章

  1. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  2. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

  3. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  4. LG2662 牛场围栏 和 test20181107 数学题

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

  5. luoguP3951 小凯的疑惑/P2662 牛场围栏

    其实就是当年sxy给我讲的墨墨的等式,只是当时比较菜听得似懂非懂. 小凯的疑惑 去年noipday1t1,当时随便猜了个结论结果猜对了,现在瞎证一下,答案是a*b-a-b. 设a为a,b中较小的一个, ...

  6. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  7. 牛场围栏(vijos 1054)

    题目大意: 给出N种木棍(每种木棍数量无限)的长度(<=3000),每根木棍可以把它切掉[1,M]的长度来得到新的木棍. 求最大的不能被组合出来的长度. 如果任何长度都能组合出来或者最大值没有上 ...

  8. HDU - 5969 最大的位或 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...

  9. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

随机推荐

  1. Minimum Cost 【POJ - 2516】【网络流最小费用最大流】

    题目链接 题意: 有N个商家它们需要货物源,还有M个货物供应商,N个商家需要K种物品,每种物品都有对应的需求量,M个商家每种物品都是对应的存货,然后再是K个N*M的矩阵表示了K个物品从供货商运送到商家 ...

  2. charles模拟弱网情况

    网络主要需要注意什么场景: 弱网功能测试 无网状态测试 网络切换测试 用户体验关注 下面我们使用charles测试弱网,针对不同网络下的测试 打开charles(抓包软件)  

  3. 洛谷P2661 信息传递——并查集

    给一手链接 https://www.luogu.com.cn/problem/P2661 这道题就是 并查集求最小环 TIPS:压缩路径的时候d[x]=d[fa[x]]+d[x],而不是d[x]=d[ ...

  4. Netty之大名鼎鼎的EventLoop

    EventLoopGroup 与Reactor: 前面的章节中我们已经知道了,一个Netty 程序启动时,至少要指定一个EventLoopGroup(如果使用到的是NIO,通常是指NioEventLo ...

  5. 简单谈谈Netty的高性能之道

    传统RPC 调用性能差的三宗罪 网络传输方式问题:传统的RPC 框架或者基于RMI 等方式的远程服务(过程)调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO 会由于频繁的w ...

  6. Docker配置远程访问

    近来学习Docker部署微服务,需要配置Docker的远程访问,由于实际环境和学习资料有出入,尝试着根据网上搜索的一些相关资料进行配置,未能成功.最终通过自己摸索,成功配置Docker远程访问.现和大 ...

  7. js实现方块弹珠游戏

    下载地址:https://files.cnblogs.com/files/liumaowu/%E5%BC%B9%E4%B8%80%E5%BC%B9%E6%89%93%E6%96%B9%E5%9D%97 ...

  8. JS中对象数据类型的基本结构和操作

    Object类型 ECMAScript中的队形其实就是一组数据和功能的集合.对象可以通过执行new操作符后跟要创建的对象类型的名称来创建.而创建Object类型的示例并为其添加属性和(或)方法,就可以 ...

  9. 使用EntityFramework调用存储过程并获取存储过程返回的结果集

    [实习]刚入职,公司要求完成两个任务,任务要求使用存储过程和事务,其中一个问题要获取存储过程的查询结果集.经过多方查找和自己的实践,终于找到了方法.这里记录一下. 看到的这篇文章中给出的例子是查询单个 ...

  10. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...