简单排序--纪念品分组

194 阅读2分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目描述:

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

输入描述:

第 1 行包括一个整数 w,为每组纪念品价格之和的上限。 第 2 行为一个整数n,表示购来的纪念品的总件数。 第 3 ~ n+2 行每行包含一个正整数 pi ( 5 ≤ pi ≤ w ) ,表示所对应纪念品的价格。

输出描述:

包含一个整数,即最少的分组数目。

示例:

输入 1
输出: 2
备注: 3

这道题有一个条件,就是每组最多有两件纪念品,那么我们可以这样想,最大的加上最小的,如果超过上限,则最大的单独一组,再把第二大的加上最小的,如果没有超过上限,则两者为一组,再向内推进。 可设 i = 1, j = n; 假如 i<=j 按上述条件推进

#include<iostream>
#include<algorithm>
using namespace std;

const int M = 100000;
int w;
int n;
int a[M];

int main(){
 cin>>w>>n;
 for(int i = 1; i<=n; i++){
  cin>>a[i];
 }
 sort(a+1, a+n+1);
 int ans = 0;
 int l = 1, r = n;
 while(l<=r){
  if(a[l]+a[r] <= w && l!=r){
   ans++;
   r--;
   l++;
  }
  else{
   ans++;
   r--;
  }
 }
 cout<<ans;
 
 return 0;
} 

个人博客,欢迎来观:一萧茶楼