博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO1.3.2修理牛棚
阅读量:6003 次
发布时间:2019-06-20

本文共 1508 字,大约阅读时间需要 5 分钟。

         在学习一段时间贪心并写了一些贪心题之后,又一次看到了农夫和牛幸福美满的生活故事(雾)。嘛,闲话少说,上题目

         在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。 自顶遗失以后,农民约翰必须尽快在牛棚之上竖立起新的木板。 他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。 农民约翰想将他购买的木板总长度减到最少。

给出 M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为的答案

输入格式 Input Format

第 1 行: M , S 和 C(用空格分开)

第 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。

样例输入 Sample Input

4 50 18

3

4

6

8

14

15

16

17

21

25

26

27

30

31

40

41

42

43

样例输出 Sample Output

25

         我知道很多dalao都用DP写这道题,但我毕竟没有学到DP,而且这道题还被划在了贪心的范围内,所以我就用贪心来写题目吧。

         按照个人写法,其实到底有多少个牛棚是没有意义的。要说木板总长度最小多少,那么我们自然是希望每个盖一个单位长度的板子,但是问题在于限定了可以购买的木板数量,所以显然我们会出现几头牛共用一块长板子,但是并不是每头牛都挨着的,而且板子用的越多,总长度自然越小,那么我们可以这么想,我们先将牛的床位从小到大排序,然后用一个sum记录第一个牛到最后一个牛之间的间距,即:end-start+1 然后再从大到小排序牛的床位,用一个b数组记录每头牛的间距,最后再将b数组从大到小排序,sum减去m-1个间距即可,为什么是m-1呢,我们知道,m块板子间有m-1个空隙,下面上代码

#include <iostream>

#include <iomanip>

#include <cmath>

#include <cstdio>

#include <algorithm>

#include <cstring>

#include <ctime>

#include <functional>

using namespace std;

int m,s,c;

int sum=0;

int a[10086],b[10086];

bool pp(int x,int y)

{return x>y;}

int main()

{

         cin>>m>>s>>c;

         for(int i=0;i<c;i++)

                   cin>>a[i];

         sort(a,a+c);

         sum=a[c-1]-a[0]+1;

         for(int i=1;i<c;i++)//不计算第一个和最后一个床位

         {

                   b[i]=a[i]-a[i-1]-1;

         }

         sort(b+1,b+c,pp);//b[0]的位置还是0哇。

         for(int i=1;i<m;i++)//m块木板间存在m-1个空隙

         {

                   sum-=b[i];

         }

         cout<<sum<<endl;

         return 0;

}

         所以说……为什么USACO全是奶牛和农夫……

         //题目来源:usaco 1.3.2修理牛棚

转载于:https://www.cnblogs.com/ywjblog/p/7592854.html

你可能感兴趣的文章
GCD 并发 VS 串行 同步 VS 异步
查看>>
【收藏】常用JavaScript正则表达式汇编与示例
查看>>
笔记:PostgreSQL 、Node.js 、函数计算
查看>>
JavaScript设计模式之中介者模式
查看>>
Android 进阶路线(思维导图)
查看>>
C++ 获取桌面(Desktop)选中项
查看>>
干货:mysql索引的数据结构
查看>>
LeetCode 1 Two Sum 两数相加
查看>>
从零开始的微信支付接入(一)用户认证
查看>>
Android DDMS查看Threads情况
查看>>
连接远程桌面提示: 之前用于连接到的凭据无法工作...的解决办法
查看>>
linux何检查一个目录是否为空目录
查看>>
压缩介绍、bz2、gz、xz压缩工具
查看>>
StretchRect...果然和文档上说的一样
查看>>
Python成生随机KEY工具
查看>>
将一个数组拆分为几个至少三个元素的递增子序列
查看>>
备忘,解决WIN10下COM注册问题
查看>>
SAP移动解决方案在零售行业的应用方案及案例分享
查看>>
cx_Oracle install
查看>>
jquery ajax从后台获取数据
查看>>