USACO1.3]修理牛棚 Barn Repair
题目大意:
在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。 自门遗失以后,farmer John必须尽快在牛棚之前竖立起新的木板。 他的新木材供应商将会供应他任何他想要的长度,但是吝啬的供应商只能提供有限数目的木板。 farmer John想将他购买的木板总长度减到最少。
给出:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1<= S<=200); 牛棚里牛的总数C(1 <= C <=S);和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为答案。
输入输出格式
输入格式:
第 1 行: 木板最大的数目M ,牛棚的总数S 和 牛的总数C(用空格分开)
第 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。
输出格式:
单独的一行包含一个整数表示所需木板的最小总长度。
输入输出样例
4 50 18 3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
25
对于这个题大多数人是用贪心做的,蒟蒻看到数据范围没思考上来就写啦个DP,不过都是0ms过得 ,实际上这个DP思路完全不难,如果说把每头牛的位置排序后,第i头用j块木板的长度可以是和他前一头牛使用j块木板的到的长度,或者是自己重新用一块木板所以很容易就得到啦转移方程:
a[]牛棚编号
dp[i][j]修到第i头牛,用前j个木板所用的最短长度。
dp[i][j]=min{dp[i-1][j-1]+1,dp[i-1][j]+a[i]-a[i-1]}
dp[i-1][j-1]+1表示在第j个牛棚使用一个新木板(长度为1)进行覆盖,
dp[i-1][j]+a[i]-a[i-1]表示延长第j块木板到第i头牛
代码:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>using namespace std;#define MIN(a, b) (((a) < (b)) ? (a) : (b))/** TODO VAR. */int m, s, c;//m个板,s个棚,c头牛int num[205], dp[205][55], minn = (int)(2e9);int main(){/*a[]牛棚编号dp[i][j]修到第i头牛,用前j个木板所用的最短长度。dp[i][j]=min{dp[i-1][j-1]+1,dp[i-1][j]+a[i]-a[i-1]}dp[i-1][j-1]+1表示在第j个牛棚使用一个新木板(长度为1)进行覆盖,dp[i-1][j]+a[i]-a[i-1]表示延长第j块木板到第i头牛*/// freopen("barn1.in","r",stdin);// freopen("barn1.out","w",stdout);scanf("%d%d%d", &m, &s, &c);for(int i = 0; i < c; i++) scanf("%d", num + i);sort(num, num + c);//默认升序memset(dp, 0x3f, sizeof(dp));//一个"无穷大"10亿dp[0][0] = 1;for(int i = 1; i < c; i++)//第i头牛{for(int j = 0;j < m; j++)//第j块板{dp[i][j] = dp[i - 1][j] + (num[i] - num[i - 1]);if(j > 0) dp[i][j] = MIN(dp[i][j], dp[i - 1][j - 1] + 1);if(c - 1 == i) minn = MIN(minn, dp[i][j]);//最后一头牛,不要管木板是否用完了,记录最短木板长度}}printf("%d\n",minn);return 0;}
USACO1.3]修理牛棚 Barn Repair相关推荐
- P1209 [USACO1.3]修理牛棚 Barn Repair 的详解
P1209 [USACO1.3]修理牛棚 Barn Repair [题目网站] [USACO1.3]修理牛棚 Barn Repair - 洛谷 [题目考点] 间隔的计算 [题目思路] 先输入数据 再算 ...
- P1209 [USACO1.3]修理牛棚 Barn Repair(贪心+逆向思维)难度⭐⭐⭐
我们可以先假设只有一块木板从编号最小的牛棚一直铺到编号最大的牛棚,然后断开m-1处.自然要按相邻牛棚的编号差从大到小断开才能使我们断开的地方可以有效节省木板长度(因为中间省去的要更多) 另外,要将输入 ...
- [USACO1.3]修理牛棚 Barn Repair
https://www.luogu.org/problemnew/show/P1209 题解: 典型的贪心题目 我们可以先假设只有一块木板从编号最小的牛棚一直铺到编号最大的牛棚,然后断开m-1处.自然 ...
- P1209 [USACO1.3]修理牛棚 Barn Repair
在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜.有些牛棚里有牛,有些没有. 所有的 ...
- P1209 [USACO1.3]修理牛棚 Barn Repair(贪心)
题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
- 题解 洛谷P1209 【[USACO1.3]修理牛棚 Barn Repair】
题面: 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛 ...
- K10837 修理牛棚 Barn Repair [USACO1.4]
K10837 修理牛棚 Barn Repair [USACO1.4] 题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满 ...
- USACO修理牛棚 Barn Repair
USACO修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行 ...
- 修理牛棚 Barn Repair
题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
最新文章
- 浏览器和迅雷简单拿到动漫妹子图
- 织梦最新版后台一键更新网站、更新文档HTML卡死的解决方法
- 【PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你
- Softmax回归——logistic回归模型在多分类问题上的推广
- 4路外线(NAT+PBR真实案例)
- Apache Log4j2 远程代码执行 漏洞
- JavaScript实现MergeSort归并排序算法(附完整源码)
- 【第1篇】Python爬虫实战-王者荣耀高清壁纸下载
- 程序员专属段子集锦 2/10
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]...
- WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
- Java冒泡排序法 经典例题
- 检查服务器端口占用,服务器中如何检查端口是否开放
- 【自考】数据结构导论—二叉树计算题
- 你家kafka正常运行着吗
- Python:如何用python编写无限猴子定理
- 10.自动代理AutoProxy
- SEO优化方案及SEO操作流程-邹川
- 无旋Treap(fhq)
- MFC加载PNG图片