E. Boxers

E. Boxers

给定N个数字,每个数字可以加一或者减一

使得结果集合中不同数字个数最多

贪心

用桶装数

假如相同的数字$i$超过三个,则上面$i+1$,下面$i-1$都可以分一个

如果相同数字$i$只有两个,优先$i-1$

如果只有一个也要优先$i-1$

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sc(x) scanf("%I64d",&x);
#define read(A) for(int i=0;i<4*N;i++) scanf("%I64d",&A[i]);
#define P pair<ll,ll>
ll N;
ll q;
ll A[150005];
bool B[150005];
int main()
{
    sc(N);
    for(int i=0; i<N; i++)
    {
        sc(q);
        A[q]++;
    }
    for(int i=1; i<=150001; i++)
    {
        if(A[i]>=3)
        {
            if(i>1)
            {
                //  A[i-1]++;
                B[i-1]=1;
            }
            B[i]=1;
            B[i+1]=1;
        }
        else if(A[i]==2)
        {
            if(i>1&&B[i-1]==0)
            {
                B[i-1]=1;
            }
            else if(B[i+1]==0)
            {
                B[i+1]=1;
            }
            B[i]=1;
        }
        else if(A[i]==1)
        {
            //cout<<i<<B[i]<<endl;
            if(i>1&&B[i-1]==0)B[i-1]=1;
            else if(B[i]==1)B[i+1]=1;
            else B[i]=1;
        }
    }
    int ans=0;
    for(int i=1; i<=150001; i++)
    {
        if(B[i]){ans++;//cout<<i<<endl;
        }
 
    }
    cout<<ans<<'
';
}
原文地址:https://www.cnblogs.com/liulex/p/11355196.html