USACO修理牛棚(贪心)

在一个下着暴风雨的夜晚,大风掀翻了农夫约翰的牛棚的屋顶和大门。

牛棚一个个的并排排成一排,奶牛就住在牛棚中过夜。

由于一些奶牛正在外面度假,牛棚并没有住满,有的牛棚住着牛,有的牛棚空着。
所有的棚子的宽度都相同。

现在,约翰需要订购一批木板用来挡在牛棚的门口。

木材供应商将为他提供任意长度的木板,但是能够提供的木板数量非常有限。

约翰希望他购买的木板的总长度尽可能的小。

现在,给定可以购买的最大木板数量 M,牛棚的总数 S,牛的总数 C,以及 C 个住着牛的牛棚编号。

请你计算确保购买的木板的总长度尽可能小的情况下,为了使所有住着牛的牛棚都用木板挡住门,最少要将多少牛棚的门用木板挡住。

输入格式
第一行包含三个整数 M,S,C。

接下来 C 行,每行包含一个整数,表示一个住着牛的牛棚的编号。

输出格式
输出一个整数,表示被木板挡住门的牛棚的数量。

数据范围
1≤M≤50,
1≤S≤200,
1≤C≤S,
牛棚编号依次为 1∼S。

输入样例:
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
输出样例:
25
样例解释
一种可行的方案是,用一个木板将 38 号牛棚的门挡住,
一个木板将 1417 号牛棚的门挡住,一个木板将
 2131号牛棚的门挡住,一个木板将 4043
 号牛棚的门挡住,这样一共遮挡了 25 个牛棚的门。
#include<bits/stdc++.h>
using namespace std;
const int N=210;
int m,s,c;
int a[N];
struct node{
    int l,r;
    int sum;
    bool operator<(const node&a)const{
        return sum>a.sum;
    }
}t[N];
int main(){
    cin>>m>>s>>c;
    for(int i=1;i<=c;i++)cin>>a[i];
    sort(a+1,a+c+1);
    int k=0;
    for(int i=2;i<=c;i++){
        int b;
        b=a[i-1];
        t[k++]={b,a[i],a[i]-b-1};//相邻的点之间的没出现的牛棚数量
    }
    sort(t,t+k);
    int cnt=0;
    for(int i=0;i<m-1&&i<c-1;i++){
        cnt+=t[i].sum;
    }
    int ans=(a[c]-a[1]+1)-cnt;
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王子y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值