USACO: 1.3.2 Barn Repair(barn1) 解析

 
                                                                  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);
}
 
 
       由于自身是初学者,编程能力有限,未达到程序员的水平原因,源代码可能存在错误,也不是最优的;文字编辑一般,文中会有言辞不当。博文中的错误和不足敬请读者批评指正。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝亦

感谢博主辛勤的付出

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值