原题传送门:https://www.luogu.org/problemnew/show/P1209

首先,这是一道贪心题。  
我们先来分析它的贪心策略。  
例如,样例:  
4 50 18  
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43  
它们之间的差是:  
1 2 2 6 1 1 1 4 4 1 1 3 1 9 1 1 1  
既然我们要让木板长度最小,那么我们就得空出前m-1个最大的区域,把其他区域累加,再加上一个m(例如3~8的差是8-3=5,而实际木板长度为8-3+1=6,每个木板都多一个,那么m个木板会多出m个)。  
代码1(50分代码):

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node
  4. {
  5. int cow,div;
  6. /*
  7. cow为该牛所占牛棚编号,
  8. div为该点与上一点差,
  9. _为这是一个WA代码,
  10. */
  11. }_[];
  12. int m,s,c;
  13. bool cmp(node c,node d)
  14. {
  15. return c.div>d.div;
  16. }
  17. int main()
  18. {
  19. int ans=;
  20. scanf("%d%d%d",&m,&s,&c);
  21. scanf("%d",&_[].cow);_[].div=;
  22. for (int i=;i<=c;i++)
  23. {
  24. scanf("%d",&_[i].cow);
  25. _[i].div=_[i].cow-_[i-].cow;
  26. }
  27. sort(_+,_+c+,cmp);
  28. for (int i=m;i<=c;i++) ans+=_[i].div;
  29. ans+=m;
  30. printf("%d\n",ans);
  31. return ;
  32. }

这是一个50分代码。很显然,问题在于:认为输入的编号一定是升序序列。所以,添加abs和sort,代码为:  
代码2(80分代码):

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node
  4. {
  5. int cow,div;
  6. /*
  7. cow为该牛所占牛棚编号,
  8. div为该点与上一点差,
  9. _为这是一个WA代码。
  10. */
  11. }_[];
  12. int m,s,c;
  13. bool cmp1(node c,node d)
  14. {
  15. return c.cow<d.cow;
  16. }
  17. bool cmp2(node c,node d)
  18. {
  19. return c.div>d.div;
  20. }
  21. int main()
  22. {
  23. int ans=;
  24. scanf("%d%d%d",&m,&s,&c);
  25. scanf("%d",&_[].cow);
  26. for (int i=;i<=c;i++)
  27. scanf("%d",&_[i].cow);
  28. sort(_+,_+c+,cmp1);
  29. for (int i=;i<=c;i++) _[i].div=abs(_[i].cow-_[i-].cow);
  30. sort(_+,_+c+,cmp2);
  31. for (int i=m;i<=c;i++) ans+=_[i].div;
  32. ans+=m;
  33. printf("%d\n",ans);
  34. return ;
  35. }

这个代码很容易被认为是AC代码,其实不然。例如,测试点6,出现了m比c大的情况。那么它肯定不能用m个木板去覆盖。这种时候,我们只要在每个点上都摆一个长度为1的木板就行了,或者说,木板总长即为牛的只数。所以,代码如下:  
代码3(100分代码):

  1. //本题解由姆洋题解®提供。姆洋题解,蒟蒻们的题解。
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. struct node
  5. {
  6. int cow,div,_this,_last;
  7. /*
  8. cow为该牛所占牛棚编号,
  9. div为该点与上一点差,
  10. _this为该点,_last为上一点。
  11. */
  12. }_[];
  13. int m,s,c;
  14. bool cmp1(node c,node d)
  15. {
  16. return c.cow<d.cow;
  17. }
  18. bool cmp2(node c,node d)
  19. {
  20. return c.div>d.div;
  21. }
  22. int main()
  23. {
  24. int ans=;
  25. scanf("%d%d%d",&m,&s,&c);
  26. if (m>=c) {printf("%d\n",c);return ;}
  27. scanf("%d",&_[].cow);_[]._last=;_[]._this=;
  28. for (int i=;i<=c;i++)
  29. scanf("%d",&_[i].cow);
  30. sort(_+,_+c+,cmp1);
  31. for (int i=;i<=c;i++) _[i].div=abs(_[i].cow-_[i-].cow),_[i]._this=i,_[i]._last=i-;
  32. sort(_+,_+c+,cmp2);
  33. for (int i=m;i<=c;i++) ans+=_[i].div;
  34. ans+=m;
  35. printf("%d\n",ans);
  36. return ;
  37. }

洛谷题解:P1209 【[USACO1.3]修理牛棚 Barn Repair】的更多相关文章

  1. 洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair

    P1209 [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. ...

  2. P1209 [USACO1.3]修理牛棚 Barn Repair

    P1209 [USACO1.3]修理牛棚 Barn Repair 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. ...

  3. 洛谷 P1209 [USACO1.3]修理牛棚 Barn Repair题解

    题目 打死我也没想到是贪心 虽然是lkx写了贪心题解让我去点赞我才写的这道题 神仙思路 首先排好序 假设我们现在只有一块木板 我们做一个差分数组 对这个差分数组排序之后 一次断开最长的区间 m-1次之 ...

  4. 洛谷P1209 [USACO1.3]修理牛棚 Barn Repair

    题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...

  5. 洛谷——P1209 [USACO1.3]修理牛棚 Barn Repair

    https://www.luogu.org/problem/show?pid=1209 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假 ...

  6. USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)

    usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...

  7. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  8. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  9. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

随机推荐

  1. c++ 控制台输入参数

    #include <iostream>#include <string> using namespace std; int main(int argc,char **argv) ...

  2. MVC分页技术

    这个是用的插件分页技术 前台引用和js <script type="text/javascript" src="/js/jquery-1.10.2.min.js&q ...

  3. js中各种距离clientWidth

    1: offsetLeft.offsetTop.offsetHeight.offsetWidth 1.1 偏移参照——定位父级offsetParent   offsetParent的定义是:与当前元素 ...

  4. (C# 基础) 接口

    接口是表示一组函数成员,而不实现成员的引用类型.类和结构可以实现接口. 例如BCL声明了一个叫做IComparable的接口,包含了一个CompareTo方法, 但没有实现其方法,用“:”结尾. pu ...

  5. 关于如何等待一个元素的出现而不用一些笨拙粗暴的time.sleep()方法

    我相信这是一个非常大众化的需求,我们需要等待某一个元素的出现以此来让我们的脚本进入到下一个Step,这个等待方法最好能够设置超时时间,然后找到后迅速callback.我们也很幸运!如果你仔细看Sele ...

  6. sqlalchemy使用tip

    https://docs.sqlalchemy.org/en/latest/orm/tutorial.html http://docs.sqlalchemy.org/en/latest/core/sq ...

  7. springboot 修改和设置 banner

    springboot 修改和设置 banner 先上图 修改步骤 1.在src/main/resources下新建一个banner.txt文档 2.通过http://patorjk.com/softw ...

  8. 关于 no device found for connection ‘ System eth0′问题

    在Vmware上面安装CentOS,开机后,使用:service network restart时,会提示一下错误: Shutting down loopback interface:         ...

  9. 笨办法学Python(十六)

    习题 16: 读写文件 如果你做了上一个练习的加分习题,你应该已经了解了各种文件相关的命令(方法/函数).你应该记住的命令如下: close – 关闭文件.跟你编辑器的 文件->保存.. 一个意 ...

  10. 安装国际版firefox(火狐浏览器)并设置语言为中文

    访问https://www.mozilla.org/zh-CN/firefox/new/?scene=2下载.安装: 访问https://addons.mozilla.org/zh-CN/firefo ...