txh0609

导航

 

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

题目描述

在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶、门被吹飞了,好在许多牛正在度假,所以牛棚没有住满。

牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。有些牛棚里有牛,有些没有。所有的牛棚有相同的宽度。

自门遗失以后,Farmer John 必须尽快在牛棚之前竖立起新的木板。他的新木材供应商将会供应他任何他想要的长度,但是吝啬的供应商只能提供有限数目的木板。Farmer John 想将他购买的木板总长度减到最少。

给出 $m,s,c$,表示木板最大的数目、牛棚的总数、牛的总数;以及每头牛所在牛棚的编号,请算出拦住所有有牛的牛棚所需木板的最小总长度。

输入格式

一行三个整数 $m,s,c$,意义如题目描述。
接下来 $c$ 行,每行包含一个整数,表示牛所占的牛棚的编号。

输出格式

输出一行一个整数,表示所需木板的最小总长度。

#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
    return a>b;//从大到小排序
}
int main(){
     int m,s,c,ans;
     int a[205],b[205];
     cin>>m>>s>>c;
     for(int i=1;i<=c;i++){
          cin>>a[i];//输入每个牛的房间号
     }
     sort(a+1,a+c+1);
     for(int i=1;i<c;i++){
          b[i]=a[i+1]-a[i]-1;//求房间间的距离
     }
     sort(b+1,b+c,cmp);
     ans=a[c]-a[1]+1;
     for(int i=1;i<m&&i<c;i++){
          ans-=b[i];//从大开始减房间距离,典型贪心
     }  
     cout<<ans;//输出
     return 0;
}//AC 
posted on 2026-04-18 21:12  txh0609  阅读(20)  评论(0)    收藏  举报