帮忙看看哪错了

纪念品分组

题目描述:
元旦快到了,学校的同学们让乐乐负责跨年晚会的纪念品分发工作。为了使参加聚会的同学们获得的纪念品价值相对均衡,他须将购买的纪念品按价值分组,每组纪念品最多只能包含两件,且每组纪念品价值的总和不能超过给定的价格。为了确保在最短的时间内分发所有的纪念品,乐乐需要让纪念品分出的组数尽量少。
你的任务是编写一个程序,找到最少的组数并输出。
输入格式:
第一行包含一个整数w,即每组纪念品价格总和的上限。
第二行是一个整数n,代表购买的纪念品总数。
第3~n+2行每行包含一个正整数pi(5<=pi<=w),表示对应纪念品的价格。
输出格式:
一个整数,即最小组数。
样例输入:

10
3
5 7 1

样本输出:

2

数据范围:
50% 的数据满足:1<=n<=15
100% 的数据满足:1<=n<=30000, 80<=w<=200

我的代码:

#include<bits/stdc++.h>
using namespace std;
int w,n,a[100001];
int main()
{
	cin>>w>>n;
	for(int k=1;k<=n;k++)
	{
		cin>>a[k];
	}
	sort(a+1,a+1+n);
	int i=0,j=n-1;
	for(;i<j;)
	{
		if(a[i]+a[j]<=w)
		{
			i++;
			j--;
		}
		else
		{
			j--;
		}
	}
	printf("%d",(n-(i*2)+i));
	return 0;
}

望高人赐教!

1 个赞
#include<bits/stdc++.h>
using namespace std;
int W,ans=0;
int n,a[30001];
int l,r,i;
int main(){
    scanf("%d%d",&W,&n);
    for(i=1;i<=n;i++)
      scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    l=1;  r=n;
    while(l<=r){
        if(a[l]+a[r]<=W)
          l++,r--,ans++;
        else
          r--,ans++;
    }
    printf("%d",ans);
    return 0;
}

代码如上~

2 个赞

不要直接发代码

1 个赞