贪心求解

1.典型的贪心问题,首先对输入的数据排序,按照从小到大来排序
2.我们定义左端点与右端点,如果左端点+右端点小于目标数,那就左边++,右边--,满足要求的数++,如果不满足那就取右边一个就行,因为右边的是大的数,所以这时只进行右边--与满足要求的数++。
3.最后,如果只剩下一个数,也就是r==l,那么就直接取这个数就行了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn], vis[maxn];
int main()
{
    int sum, n;
    scanf("%d%d", &sum, &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    sort(a + 1, a + n + 1);
    int l = 1, r = n, cnt = 0;
    while (l < r)
    {
        if (a[l] + a[r] <= sum)
            ++l;
        --r;
        ++cnt;
    }
    if (l == r)
        ++cnt;
    printf("%d\n", cnt);
    return 0;
}