修理牛棚AC代码
2026-03-22 19:42:07
发布于:上海
5阅读
0回复
0点赞
解题思路
核心是贪心算法,核心逻辑是「用有限的木板数,优先跳过最大的空牛棚间隔,从而最小化总木板长度」,具体步骤:
特殊情况处理:若木板数 M ≥ 牛的数量 C,直接用 C 块木板各盖 1 个有牛的牛棚,总长度就是 C(最优解);
基础长度计算:先将有牛的牛棚位置排序,计算「覆盖所有有牛牛棚的最小连续长度」(最后一个有牛位置 - 第一个有牛位置 + 1);
找空间隔并排序:计算相邻有牛位置之间的空牛棚数(间隔),按从大到小排序;
贪心减间隔:用 M 块木板最多能拆分出 M-1 个间隔跳过,因此累加前 M-1 个最大的间隔,从基础长度中减去这些间隔,得到的就是最小总木板长度。
100%AC代码:
#include<bits/stdc++.h>
using namespace std;
int m,s,c,a[205],b[205],k,t;
int main(){
cin>>m>>s>>c;
for(int i=0;i<c;i++){
cin>>a[i];
}
if(m>=c){
cout<<c;
return 0;
}
sort(a,a+c);
for(int i=1;i<c;i++){
if(a[i]-a[i-1]>1){
b[k++]=a[i]-a[i-1]-1;
}
}
sort(b,b+k,greater<int>());
for(int i=0;i<m-1&&i<k;i++){
t+=b[i];
}
cout<<a[c-1]-a[0]+1-t;
return 0;
}
总结
核心策略:优先跳过最大的空牛棚间隔,减少木板需要覆盖的长度;
关键步骤:排序有牛位置→算总连续长度→算并排序空间隔→减最大的 M-1 个间隔。
全部评论 1
原代码提交于2026/3/22晚上19点40分
7小时前 来自 上海
1




有帮助,赞一个