解题思路:

注意事项:

参考代码:

/*******************解题思路***********************

将所有礼品价值进行排序————>判断排序后首尾两数之和与最大价值谁大(因为每组不超过2个物品)

                                                 ————>在分类(谁大),然后讨论

(仅提供思路,具体实现方法看代码)

*/

#include<stdio.h>

void sort(int n,int max);//排序

int cheak(int *,int,int); //找出最小组


/******************************************/

int main ()

{

    int max;     //每组能拥有的最大价值

    int n;       //礼品数

    int min;     //最小组数

    

scanf("%d",&max);

scanf("%d",&n);

sort(n,max);  //排序

return 0;

}

/******************************************/

void sort(int n,int max)

{

int num[n];  //储存排序后的数组

int a;       //中间量

int min;

for(int i=0;i<n;i++)

scanf("%d",&num[i]);

for(int i=0;i<n;i++)    //冒泡排序

  for (int j=i;j<n;j++){

  if(num[i]<num[j])

  {

  a=num[i];

  num[i]=num[j];

  num[j]=a;

  }

  }

  

min=cheak(num,max,n);

printf ("%d\n",min);

}

/******************************************/

int cheak(int *num,int max,int n) //找出最小组

{      

int min=0;          //最小组数

int n1=n-1;

for(int i=0;i<n;)    //思路找排序后,首尾两端的和与每组最大值比较

{

if(i!=n1&&num[i]+num[n1]<=max)

{

min++;

i++;

n1--;

}

else

{

i++;

min++;}

if(i>n1)

break;

  }

return min;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

超级彩笔 3年前 回复TA
简单易懂
最后一步简化了一下

void cheak(int *num,int max,int n){
	
	int count = 0;
	int i;
	int m = n - 1;
	
	for(i = 0;i <= m;i++)
	{
		if(num[i] + num[m] <= max)
			m--;
			
		count++;		
	}
	
	printf("%d",count);
}