题目描述

纪念品分组

https://ac.nowcoder.com/acm/problem/16640

思路:1.因为主要点是希望分组的数目最少,所以应该尽量多的配组。2.配组时最小的应该与尽量大的数值相配,所以为了方便应该进行排序。3.最小的数值与最大值相加,如果大于上限则将最大值单独分为一组,反之则将最大值与最小值分为一组。
步骤:1.排序(c++可以用algorithm库)2.主要步骤:整体用while循环,设计两个值一个指向数组最小值,一个指向数组最大值。然后根据两种情况进行移动。
注意:最后两种结束循环方式,第一种是是刚好剩一个的时候及两个值相等,第二种是刚好没有剩及相差为-1.
#include "stdio.h"
#include "algorithm"
#include "iostream"
using namespace std;
void Grouping(int a[],int n,int max);
int main()
{
int max,N,i;
cin>>max>>N;
int array[N];
for(i=0;i<N;i++){
cin>>array[i];
}
sort(array,array+N);
Grouping(array,N,max);
}
void Grouping(int a[],int n,int max)
{
int left=0;
int right=n-1;
int num=0;
while(1){
if(a[left]+a[right]>max){
right--;num++;
}else{
right--;left++;num++;
}
if(left==right){num++;break;}
if(right-left==-1)break;
}
cout<<num;
}
```

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务