杭电ACM——1009——FatMouse'Trade

第三次完全自己写并一次AC,哈哈哈,虽然用了两三个小时,还行吧,慢慢来,嘿嘿。

很多细节老是搞错,所以纠错花了很久,步骤一个一个输出看是哪里出错(纠错的时候还犯些小错误影响流畅性)。比如%f都给写成%d,该定义为double类型的定义成int······还有些其他的无法言说的低级错误······当然,中间也查了一些函数用法之类的,比如memset我不知道它可不可以用到int,double等的类型上,还有找那个返回数组最大值下标的函数,本来想看一下有没有现成的库函数,好像没有吧,所以自己写吧,也能更贴合要求
再炫一句感觉很酷的英语:I want you to be the best version of yourself.哈哈哈,开开心心睡觉去。
#include < stdio.h >
#include < string.h >

int sortIndex ( double[] );

int main()
{
	int M , N , J[1000] , F[1000];
	double JavaBeans;  //FatMouse换来的JavaBeans
	int i , j;
	double value[1000] , temp[1000];  //value存储房间N的实惠度(单位CatFoof可以换取的JavaBeans),temp是为了之后拷贝value数组从而进行实惠度排序
	int sort[1000];  //sort按实惠度由大到小存储该实惠度对应的房间号

	while ( 1 ) 
	{
		scanf ( "%d %d" , &M , &N );
		//printf ( "M = %d , N = %d\n" , M , N );
		if ( M == -1 && N == -1 )
		{
			return 0;
		}
		i = 0;
		JavaBeans = 0;		
		
		memset ( J , 0 , sizeof(J) );
		memset ( F , 0 , sizeof(F) );
		memset ( value , 0 , sizeof(value) );
		memset ( temp , 0 , sizeof(temp) );
		memset ( sort , 0 ,sizeof(sort) );
		
		/* 效果与上面用memset初始化相同
		for ( j=0 ; j<1000 ; j++ )
		{
			J[j] = -1;
			F[j] = -1;
			value[j] = -1;
			temp[j] = -1;
			sort[j] = -1;
		}
		*/
		while ( i < N )
		{
			scanf ( "%d %d" , &J[i] , &F[i] );
			//printf ( "J[%d] = %d , F[%d] = %d\n" , i , J[i] , i , F[i] );
			value[i] = (double)J[i]/F[i];
			//printf ( "value[%d] = %f\n" , i , value[i] );
			i++;
		}
		memcpy ( temp , value , sizeof(value) ) ;
		for ( j=0 ; j<1000 ; j++ )
		{
			sort[j] = sortIndex(temp);
			//printf ( "sort[%d] = %d\n" , j , sort[j] );
			if ( sort[j] == -1 )
			{
				break;
			}
		}
		for ( j=0 ; j<1000 ; j++ )
		{
			if ( sort[j] == -1 )  //当sort[j]==-1时,说明有效数据已经处理完毕,无需再往下进行,所以break跳出循环
			{
				break;
			}
			if ( M >= F[sort[j]] )
			{
				JavaBeans += J[sort[j]];
				M -= F[sort[j]];
				//printf ( "当j = %d时,%f\n" , j , JavaBeans );
			}
			else 
			{
				JavaBeans += M * value[sort[j]];
				//printf ( "当j = %d时,%f\n" , j , JavaBeans );
				break;
			}
		}
		printf ( "%0.3f\n" , JavaBeans );
	}

	return 0;
}


//返回数组a中最大值的下标,然后将该值改为-1,这样下次就返回的是原数组次大数的下标。
//但因为数组a并不是全部都是有效数据(在这里指a数组中不等于-1的值),所以当max等于-1时,说明有效数据的下标已经排序完毕,对于无效数据返回index=-1。
int sortIndex ( double a[] ) 
{
	int index = 0;
	double max = -1;
	int i = 0;
	for ( i=0 ; i<1000 ; i++ ) 
	{
		if ( a[i] > max )
		{
			max = a[i];
			index = i;
		}
	}
	if ( max == -1 )
	{
		index = -1;
		return index;
	}
	a[index] = -1;  //将这次找出的最大值改为-1
	return index;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YANG_LJ_is_ME

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值