题目描述:
解题思路:
本题使用贪心思想,先排序,则最大和最小就分别位于头部和尾部。如果最大和最小之和不超过容量,就取两个放到一个(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 f = 1, r = n, ans = 0;while(f <= r){ans++;//写在这里可以减小ans书写的次数,跟简洁if(f == r)break;//注意if break的位置,放在太后面会导致错误if(a[f] + a[r] <= w){f++; r--;//去除}else r--;}cout << ans << "\n";return 0;
}