jzoj3792,P2062-分队问题【贪心】

前言

题解上说:
这里写图片描述
然而我的贪心不仅A了,而且
这里写图片描述
反例也A了

自己的洛谷题解链接:https://www.luogu.org/blog/user52918/solution-p2062


正题


大意

n个人,每个人有一个要求a[i]表示他所在的队伍里不可以少于a[i]个人,然后可以分成求最大的队伍数量。


解题思路

贪心的思想就是尽量将要求大的人放在一起。所以我们要先排个序,从大到小,然后用一个now表示当前队列还需多少个人可以满足条件
初始代码:

    now=a[1];
    for (int i=1;i<=n;i++)
    {
        now--;
        if (!now)
        {
            now=a[i];
            s++;
            w=false;
        }
    }

然后我们可以发现:
8
1 2 4 5 5 5 5 5

这一组数据中我们会将4归入第二个队列,导致第二个队列不成立,所以我们需要进行优化该情况。如果我们发现将目前在队列里的的归入前一个队列会更优的话我们就可以直接改变now


代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1000001],now,s,maxs;
bool w;
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    sort(a+1,a+1+n,cmp);//排序
    w=true;//第一个队列无法将之前的合并到前一个队列
    now=a[1];
    for (int i=1;i<=n;i++)
    {
        if (a[i]<now&&!w)
            now=a[i];//发现更优情况
        now--;
        if (!now)//已经满足要求
        {
            now=a[i];
            s++;
            w=false;
        }
    }
    printf("%d",s);
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/80988719
今日推荐