根据题目意思,进行一趟升序排序,然后每次都将最小的跟最大的组合,如果超出上限,让最大的单独一组,即右边指针左移,如果满足的话左指针右移,右指针左移;
#include <bits/stdc++.h> #define MAX 100005 #define ll long long using namespace std; int main() { ll w,n,a[MAX],i,j,ans=0; cin>>w>>n; for(i=0 ; i<n ; i++) cin>>a[i]; sort(a,a+n); i=0 ; j=n-1; while(i<=j) { if(a[i]+a[j]<=w) { ans++; i++; j--; } else { ans++; j--; } } cout<<ans<<endl; return 0; }