CodeForces 140C New Year Snowmen

二分,贪心。

二分答案,然后贪心验证即可。

#include<bits/stdc++.h>
using namespace std;

int n,a[100010];
int p[100010][3];
int sz[100010];

bool check(int x)
{
    if(x==0) return 1;

    memset(sz,0,sizeof sz);

    for(int i=1;i<=x;i++)
    {
        p[i][0]=a[i];
        sz[i]=1;
    }

    int now=1;
    for(int i=x+1;i<=n;i++)
    {
        if(p[now][sz[now]-1]==a[i]) continue;

        if(sz[now]==3) break;
        p[now][sz[now]]=a[i];
        sz[now]++;

        now++;
        if(now==x+1) now=1;
    }

    for(int i=1;i<=x;i++)
    {
        if(sz[i]<3) return 0;

    }
    return 1;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    sort(a+1,a+1+n);

    int L=0,R=n/3,ans;

    while(L<=R)
    {
        int mid=(L+R)/2;
        if(check(mid)) L=mid+1,ans=mid;
        else R=mid-1;
    }

    check(ans);

    printf("%d\n",ans);
    for(int i=1;i<=ans;i++)
    {
        printf("%d %d %d\n",p[i][2],p[i][1],p[i][0]);
    }

    return 0;
}

 

posted @ 2017-02-25 21:05  Fighting_Heart  阅读(149)  评论(0编辑  收藏  举报