分析:可以想象只用一个木板,这样需要一个长度x,然后计算每两个相邻牛之间的空隙长度,排序。然后需要几个木板就减去相应的空隙长度(从大到小依次减)
#include <iostream>
#include <string.h>
#include <fstream>
#include <stdlib.h>
using namespace std;
bool ans[201];
struct PP
{
int x;
int y;
int len;
};
int cmd1(const void*,const void*);
int main()
{
ifstream cin("barn1.in");
ofstream cout("barn1.out");
memset(ans,0,sizeof(ans));
int mubannum,niupengnum,niunum;
PP jiange[201];
int min;
memset(jiange,0,sizeof(jiange));
cin>>mubannum>>niupengnum>>niunum;
if(niunum==1)
cout<<"1"<<endl;
else if (mubannum>niunum)
cout<<niunum<<endl;
else
{
int i,j;
for(i=0;i<niunum;i++)
{
cin>>j;
ans[j]=1;
}
j=0;
for(i=0;i<=niupengnum;i++)
{
if(j==0&&ans[i]==1)
{
jiange[j].x=i;
j++;
}
else if(ans[i]==1&&j!=0)
{
jiange[j-1].y=i;
jiange[j].x=i;
j++;
}
}
j--;
for(i=0;i<=j;i++)
jiange[i].len=jiange[i].y-jiange[i].x-1;
min=jiange[j-1].y-jiange[0].x+1;
qsort(jiange,j,sizeof(PP),cmd1);
j--;
for(i=0;i<mubannum-1;i++)
min-=jiange[j--].len;
cout<<min<<endl;
}
return 0;
}
int cmd1(const void* a,const void* b)
{
struct PP *c=(PP *)a;
struct PP *d=(PP *)b;
return c->len>d->len?1:-1;
}