牛场围栏

题目背景

小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。

输入输出样例

输入样例#1:

2 1
7 11

输出样例#1:

15

说明

40 % :1< N< 10,  0< M< 300

100 % :1< N< 100,  0< M< 3000

分类讨论

1、若木料可以取到1,无解

2、若任意木料的gcd大于1,有无穷解

3、若gcd(a,b)=1,则上限为ab-a-b

证明:http://blog.csdn.net/archibaldyangfan/article/details/7637831

然后此题变成水背包。。。听说还能用最短路。。。然而我并不会。。。

const oo=9000010;maxn=3010;
var f:array[0..oo] of boolean;
    temp,n,m,i,j,tot,mingcd:longint;
    a:array[0..maxn] of longint;
    bool:array[0..maxn] of boolean;

procedure swap(var x,y:longint);
var t:longint;
begin
  t:=x;x:=y;y:=t;
end;

procedure gcd(a,b:longint);
var r:longint;
begin
  r:=a mod b;
  if r=0 then mingcd:=b else gcd(b,r);
end;

begin
read(n,m);
for i:=1 to n do
begin
  read(a[i]);
  bool[a[i]]:=true;
end;
for i:=1 to n do
  for j:=1 to m do
  begin
    if a[i]-j<=0 then break;
    bool[a[i]-j]:=true;
  end;
if bool[1] then
begin
  write(-1);
  halt;
end;
tot:=0;
for i:=1 to 3000 do
  if bool[i] then
  begin
    inc(tot);
    a[tot]:=i;
    if mingcd=0 then mingcd:=i else gcd(i,mingcd);
  end;
if mingcd<>1 then
begin
  write(-1);
  halt;
end;
i:=0;f[0]:=true;
while true do
begin
  inc(i);
  for j:=1 to tot do
  begin
    if a[j]>i then break;
    if f[i-a[j]] then
    begin
      f[i]:=true;
      break;
    end;
  end;
  if f[i]=false then temp:=0 else inc(temp);
  if temp=a[1] then
  begin
    write(i-temp);
    halt;
  end;
end;
end.

时间: 2024-12-27 21:45:16

牛场围栏的相关文章

vijos 1054 牛场围栏 【想法题】

这题刚看完后第一个想到的方法是背包 但仔细分析数据范围后会发现这题用背包做复杂度很高 比如对于这样的数据 2 100 2999 2898 (如果有神犇可以用背包过掉这样的数据 请回复下背包的做法) ----------------------------------------------------------------------------------- 在翻看了vijos上自带题解区后 会发现有些人提到了最短路 设最后可用木料中最短的长度为L0 则显然若长度X可以得到 那么长度X+L0

牛场围栏(vijos 1054)

题目大意: 给出N种木棍(每种木棍数量无限)的长度(<=3000),每根木棍可以把它切掉[1,M]的长度来得到新的木棍. 求最大的不能被组合出来的长度. 如果任何长度都能组合出来或者最大值没有上限输出-1.    (1<N<100, 0<=M<3000), 解题过程: 1.这题就是USACO 4.1的麦香牛块 ,只不过 数据 加强了下. 当时就把它当做 背包 来做,然后确定一个较大的范围(当时就选了60000),求出这个范围里的长度能否都被组合出来,如果能就输出-1. 否则输

洛谷P1578 奶牛浴场

P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是

vijos p1005 奶牛浴场[ 极大化思想]

奶牛浴场 描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴

P1578 奶牛浴场

题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮

地理围栏

地理围栏技术 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界.当手机进入.离开某个特定地理区域,或在该区域内活动时,手机可以接收自动通知和警告.有了地理围栏技术,位置社交网站就可以帮助用户在进入某一地区时自动登记. 1地理围栏核心 在地理围栏中,有几个核心,区别与普通的LBS: 1.地理区域是被网格化的.网格化的标准是根据一个地理区域内的业务和商业聚类的,而不是纯粹

洛谷P2362 围栏木桩----dp思路

在翻dp水题的时候找到的有趣的题0v0 原文>>https://www.luogu.org/problem/show?pid=2362<< 题目描述 某农场有一个由按编号排列的n根木桩构成的首尾不相连的围栏.现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列.所谓的升序序列就是序列中的任何一个数都不小于它之前的任何一个数.试编写程序从这个围栏中选取合适的木桩使得选出的木桩个数t最大,并求出选取出t根木桩的方案总数c. 输入输出格式 输入格式: 文件

AC日记——围栏木桩 洛谷 P2362

围栏木桩 思路: DP: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 2001 int n,m,ai[maxn],dp[maxn][maxn]; int main() { scanf("%d",&n); for(int no=1;no<=n;no++) { scanf("%d",&m);int t=0,c=0; for(int i=1;i<=m;

在 Android* 商务应用中实施地图和地理围栏特性

摘要 本案例研究讨论了怎样将地图和地理定位特性构建到 Android* 商务应用中.包含在 Google Maps* 上覆盖商店位置,以及在设备进入商店地理围栏邻近区域时借助地理围栏通知用户. 文件夹 摘要 概述 在 Google Maps 上显示商店位置 Google Maps Android API v2 在应用清单中指定应用设置 加入地图 Fragment 发送地理围栏通知 注冊和取消注冊地理围栏 实施位置服务回调 实施意向服务 总结 參考文献 作者介绍 概述 在本案例研究中,我们将会把地