Barn Repair(barn1) 解析
修理牛棚,给出 M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C<=S) 牛棚里牛的牛棚数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。输出所需木板的最小总长度作为的答案。
这是一道比较简单的题目,只要想到方法就很简单。我的思路很简单,先对有牛的牛棚编号排序,再求出其中最大的M-1个间隔之和,sinterval,所需木板的最小总长度=开始编号-结束编号-sinterval。
我的步骤是这样:首先构造
typedef struct{ int start,end,interval;} Interval;的结构体,创建结构数组Interval in[max],读入牛棚的编号至in[max].start,按照牛棚的开始编号start对interval结构排序;
然后赋值in[i].end=in[i+1].start(i<ccows-1),计算出所有C-1个间隔大小;最后按照牛棚的interval大小对in[max]结构排序,求出所有M-1个最大间隔之和sinterval+=in[i].interval;所需木板的最小总长度作为end-sinterval-start,其中(start=in[0].start;end=in[ccows-1].start)。
/*ID:pen*****
LANG:C
TASK:barn1
*/
#include<stdio.h>
#include<stdlib.h>
#define max 200
typedef struct
{
int start,end,interval;
} Interval;
Interval in[max];
int cmp(const void *va,const void *vb)
{
return ((Interval *)vb)->interval - ((Interval *)va)->interval;//large to small
/*Interval *a, *b;//equal to return ((Interval *)va)->interval - ((Interval *)vb)->interval;
a = (Interval *)va;
b = (Interval *)vb;
if(a->interval > b->interval)//Farmer½á¹¹³ÉÔ±
return 1;
if(a->interval < b->interval)
return -1;
return 0;*/
}
int cmp1(const void *va,const void *vb)
{
return ((Interval *)va)->start - ((Interval *)vb)->start;
}
int main()
{
freopen("barn1.txt","r",stdin);
//freopen("barn1.out","w",stdout);
int mboard,sstall,ccows,i,start,end; //stall_num[200] M (1 <= M <= 50) (1 <= S <= 200) (1 <= C <= S) (1 <= stall_number <= S),
scanf("%d %d %d",&mboard,&sstall,&ccows);
for (i=0;i<ccows;i++)
{
scanf("%d",&in[i].start);
}
qsort(in,ccows,sizeof(in[0]),cmp1);
start=in[0].start;
end=in[ccows-1].start;
for (i=0;i<ccows-1;i++){
in[i].end=in[i+1].start;
in[i].interval=in[i].end-in[i].start-1;
}
qsort(in,ccows-1,sizeof(in[0]),cmp);
int sinterval=0;
for(i=0;i<mboard-1;i++){
sinterval+=in[i].interval;
}
printf("%d\n",end-sinterval-start+1);
return(0);
}
由于自身是初学者,编程能力有限,未达到程序员的水平原因,源代码可能存在错误,也不是最优的;文字编辑一般,文中会有言辞不当。博文中的错误和不足敬请读者批评指正。