先排序,用双指针扫描
定义 L 为左指针,R 为右指针,总组数sum=0,每次相加左右指针指向的元素,若大于价格上限则R--,sum++;
否则两指针同时往中间移一位即L++,R--;
如果L==R,说明只剩下一个数了,总组数sum++,如果L>R,就结束了。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w,n,sum=0;
cin>>w>>n;
int a[n];
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=n-1;
while(l<=r)
{
while(a[l]+a[r]>w&&l<r) sum++,r--;//如果大于就右指针向左移
l++;
r--;
sum++;//小于等于的话就让l++,r--,总组数+1
}
cout<<sum;
return 0;
}
京公网安备 11010502036488号