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) ...
随机推荐
- 20190820 On Java8 第十章 接口
第十章 接口 接口和抽象类提供了一种将接口与实现分离的更加结构化的方法. 抽象类和方法 包含抽象方法的类叫做抽象类.如果一个类包含一个或多个抽象方法,那么类本身也必须限定为抽象的,否则,编译器会报错. ...
- jsp(java server page)
jsp的组成元素; 1, 指令 page指令 <%@ page ..........%> language---当前页面使用的语言:java import---当前页面引入的类库, 默认是 ...
- go 上下文context
go控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context WaitGroup这种方式是控制多个goroutine同时完成 func main() { var wg sync. ...
- CodeChef Count Substrings
Count Substrings Problem code: CSUB Submit All Submissions All submissions for this problem ar ...
- 【转】Linux下vim的基本操作
原文链接 Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能 ...
- Spring Data Redis实战之提供RedisTemplate
参考: http://www.cnblogs.com/edwinchen/p/3816938.html 本项目创建的是Maven项目 一.pom.xml引入dependencies <depen ...
- js本地时间格式化
var myDate = new Date(); //获取当前时间及日期 var year=myDate.getYear(); // 获取当前年份(当前年份-1900) var fyear=myDat ...
- shell根据系统当前的时间向用户输出问候信息
- 六 BASH 高级变量
高级变量分为三类 变量扩展 ${变量名} 例 ${filename} 大括号 命令替换 $(命令) $(ls /) 小括号 算术扩展 $((算数式)) $(( ...
- java的任务
1.完善现有的日志记录系统,对异常进行处理和记录 2.基于需求实现账号信息录入接口