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) ...
随机推荐
- 舔狗【2019河北省大学生程序设计竞赛 J题】
题目描述 > “舔狗舔狗,> 舔到最后,> 一无所有.” 有 n 只舔狗,每只舔狗的心中都有自己朝思暮想的一位. 每个人虽然受到了一万次拒绝,还毅然第一万零一次鼓起勇气. 作为一个不 ...
- AdaGrad Algorithm and RMSProp
AdaGrad全称是Adaptive Gradient Algorithm,是标准Gradient Descent的又一个派生算法.标准Gradient Descent的更新公式为: 其中Learni ...
- python包的补充
1.包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间 2.常见目录结构 import os 2 os.makedirs('glance/api') 3 os.makedirs('gl ...
- centos 6.x 配置 mail 发送外部邮件详解和 sendmail 使用简介
一.mail基本配置 1.配置:vim /etc/mail.rc 在文件末尾追加以下内容: set from=@.com # 别名<123456789@163.com> set smtp= ...
- 开发中遇到的相关linux问题
一:java.sql.SQLException: Access denied for user 'root'@'10.150.152.200' (using password: YES) 1:用户名后 ...
- mysql DATETIME和TIMESTAMP类型
以mysql 5.7.20 为例 一直以来,理解有偏差,作此记录,纠正 一.DATETIME和TIMESTAMP 都有高达微秒(6位)的精度 范围 DATETIME 1000-01-01 00: ...
- Solution for NULL pointer dereference
•mmap_min_addr forbids users from mapping low addresses 1. First available in July 2007 2. Several c ...
- JQuery的链式编程与隐式迭代
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- elasticsearch查询与sql对应关系
must: AND must_not:NOT should:OR
- mysql,分组后,再次进行过滤
查出平均分大于80以上的班级 select class_id, avg(score) from students group by class_id having avg(score)>80; ...