【OJ练习】纪念品分组

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

函数:void GetResult(int*Input,int& Get_Result)

    输入参数:int*p 指向一维数组的首地址,该数组存放的第一个数据为每组纪念品价格之和的上线,第二个数据为购来纪念品的总数目。余下的数为每个纪念品的价格。即数组的行数为p[1]+2;
          
    Get_Result
为最少的分组数目;

    入参不用做判断,用例可以保证。
    
    
返回值:无

 

解题思路:

一个冒泡法再加一个前后匹配!

 

代码:

/*

功能:

输入参数:int*p 指向一维数组的首地址,该数组存放的第一个数据为每组纪念品价格之和的上线,

                第二个数据为购来纪念品的总数目。余下的数为每个纪念品的价格。即数组的行数为p[1]+2

          Get_Result为最少的分组数目;

                入参不用做判断,用例可以保证。

返回值:无

*/

 

void GetResult(int*Input,int& Get_Result)

{

       int temp,NUM=0;

       int i,j;

       int X=*Input;

       int Num=*(Input+1);

       for(i=2;i<Num+1;i++)

       {

              for(j=i+1;j<Num+2;j++)

              {

                     if(*(Input+i)>*(Input+j))

                     {

                            temp=*(Input+i);

                            *(Input+i)=*(Input+j);

                            *(Input+j)=temp;

                     }

              }

       }

       i=2;

       j=0;

       while(*(Input+i)!=-1)

       {

              if((*(Input+i)+*(Input+Num+1-j))>X)

              {

                     *(Input+Num+1-j)=-1;

                     j++;

                     NUM++;

              }

              else

              {

                     *(Input+Num+1-j)=-1;

                     i++;

                     j++;

                     NUM++;

              }

       }

       Get_Result=NUM;

}

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试