题目描述:
解题思路:
本题使用贪心思想,先排序,则最大和最小就分别位于头部和尾部。如果最大和最小之和不超过容量,就取两个放到一个(ans++)并去除;如果最大和最小之和超过容量,就只取最大的放到一个(ans++)并去除。最后的ans即是答案。
题解:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;//注意n<=30000,数组不能开太小
int a[N];
int main()
{
int w; cin >> w;
int n; cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a+ n +1);//看到混乱数据可以考虑先排序
int l = 1, r = n, ans = 0;//l(即left),r(即right)
while(l <= r)
{
ans++;//写在这里可以减小ans书写的次数,跟简洁
if(l == r)break;//注意if break的位置,放在太后面会导致错误
if(a[l] + a[r] <= w)
{
l++; r--;//去除
}else r--;
}
cout << ans << "\n";
return 0;
}