这一题虽说水,可以开始自己居然没想到如何做。
题意:牛棚的门坏了,你得修,所有棚排成一排,用固定数量的板子把有牛住的棚(每一块板子可以无限长),求被板子封住的门的最少数量。给你板子最多数m,牛棚的总数s,牛的数量c,和牛住的棚的编号。
这是贪心专题,所以这一题只需要选择空余的房间数量就好了,
求出牛住的最小编号Min,最大编号Max,那么只需要在Min -- > Max之间剔除最大连续空房间的板子。每剔除依次,板子的数量加一。
/**
TASK: barn1
ID: DickensTone
LANG: C++
**/
#include<cstdio>
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 200 + 5;
bool vis[maxn];
int open[maxn];
bool cmp(int x, int y)
{
return x > y;
}
int num[maxn];
int main()
{
freopen("barn1.in", "r", stdin);
freopen("barn1.out", "w", stdout);
int m, s, c;
while(scanf("%d%d%d", &m, &s, &c) == 3)
{
int Min = maxn, Max = 0;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < c; i++)
{
int t;
scanf("%d", &t);
vis[t] = 1;
Min = min(Min, t);
Max = max(Max, t);
}
//printf("%d %d\n", Max, Min);
int cnt = 0;
for(int i = Min; i <= Max; i++)
{
if(!vis[i])
open[cnt]++;
else if(open[cnt]) cnt++;
}
int ans = 0;
sort(open, open + cnt, cmp);
//for(int i = 0; i < cnt; i++)
//printf("%d\n", open[i]);
for(int i = 0; i < m - 1; i++)
{
ans = ans + open[i];
}
printf("%d\n", Max - Min - ans + 1);
}
return 0;
}