0
点赞
收藏
分享

微信扫一扫

纪念品分组(贪心)

写心之所想 2022-10-24 阅读 83


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

贪心,
每次将最小的和最大的合并,否则最大的单独划出

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
typedef long long ll;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int a[1000000];
int main()
{
// freopen("E.in","r",stdin);
// freopen(".out","w",stdout);
int n,m;
cin>>m>>n;
For(i,n) cin>>a[i];
sort(a+1,a+1+n);
int l=1,r=n,ans=0;
while(l<=r) {
if (a[l]+a[r]<=m) { l++; r--;
} else r--;
++ans;
}

cout<<ans<<endl;
return 0;
}


举报

相关推荐

0 条评论