这道题可以算是一道贪心的较好的题目
但是这道题有很多坑点
于是蒟蒻我就华丽的交了5、6次才AC
样例分析
3 4 6 8 14 15 16 17 25 26 27 30 31 40 41 42 43
1:43-3+1=41(这是假设只有一块木板时的情况)
3 4 6 8 14 15 16 17 25 26 27 30 31
40 41 42 43
2:31-3+1+43-40+1=33(删除掉相邻之间间隔最大的木板后的排序)
3 4 6 8 14 15 16 17
25 26 27 30 31
40 41 42 43
3:17-3+1+31-25+1+43-40+1=26(以此类推第三块)
3 4 6 8
14 15 16 17
25 26 27 30 31
40 41 42 43
4:8-3+1+17-14+1+31-25+1+43-40+1=21(第四块)
分析题目
1:这个题目给的数据不是有序的!!!
特判
2:如果只有一块木板,直接返回最开始的假设情况
3:如果木板数量超过牛的数量,那就直接输出牛的数量(一牛一块木板)
代码
“`cpp
include
include
include
include
include
using namespace std;
struct node {int x,y,z;}ob[205];
int f[205];
bool f1[205];
int s,m,c,ans=0;
inline int read()
{
int x=0;
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){if(c=='-')flag=1; c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return flag?-x:x;
}
bool cmp(node x,node y)
return x.z>y.z;
int main()
{
read(m),read(s),read(c);
memset(f1,0,sizeof(f1));
for(int i=1;i<=c;i++)
{
read(f[i]);
f1[f[i]]=1;
}
//f1是用来判断这个牛棚是不是空的,f是暂时储存读入的数
sort(f,f+c+1);
ans=f[c]-f[1]+1;//先假设为一块木板的情况,计算出最大长度
if(m==1)
{
cout<<ans<<endl;
return 0;
}
if(m>c)
{
cout<<c<<endl;
return 0;
}
ob[1].x=f[1];
ob[1].y=f[1];
ob[1].z=1;
for(int i=2;i<=c;i++)
{
ob[i].x=ob[i-1].y;//ob[i].x表示这个牛之前的一头的位置
ob[i].y=f[i];//ob[i].y表示当前位置
ob[i].z=ob[i].y-ob[i].x+1;//ob[i].z表示与之前一头牛的距离,
}
sort(ob,ob+c+1,cmp);
for(int i=0;i<m-1;i++)
ans-=ob[i].z-2;//依次删去最大的间隔
cout<<ans;
return 0;
}
“`cpp