codeforces 665D Simple Subset

构造。

如果给出的数字中没有1和2,那么最多只能构造出两个数字。

按照这样的思路去想即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;

int n;
int a[1000+10];
int one,two,other;
vector<int>ans[10];

bool prime(int a)
{
    if(a==1) return 0;
    if(a==2) return 1;
    for(int i=2;i*i<=a;i++)
        if(a%i==0) return 0;
    return 1;
}

void fot()
{
    int flag=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(prime(a[i]+a[j]))
            {
                ans[1].push_back(a[i]);
                ans[1].push_back(a[j]);
                flag=1; break;
            }
        }
        if(flag==1) break;
    }

    if(flag==0) ans[1].push_back(a[1]);
}

void fer()
{
    if(two==0) return ;
    ans[2].push_back(2);
}

void fyi()
{
    if(one==1) return;
    for(int i=1;i<=one;i++)
        ans[3].push_back(1);
}

void fero()
{
    if(two==0) return;
    if(other==0) return;
    ans[4].push_back(2);
    for(int i=1;i<=n;i++)
    {
        if(a[i]<=2) continue;
        if(prime(a[i]+2))
        {
            ans[4].push_back(a[i]);
            break;
        }
    }
}

void fyio()
{
    if(one==0) return;
    if(other==0) return;

    for(int i=1;i<=one;i++)
        ans[5].push_back(1);

    for(int i=1;i<=n;i++)
    {
        if(a[i]<=2) continue;
        if(prime(a[i]+1))
        {
            ans[5].push_back(a[i]);
            break;
        }
    }
}

void fyier()
{
    if(one==0) return;
    if(two==0) return;

    for(int i=1;i<=one;i++)
        ans[6].push_back(1);
    ans[6].push_back(2);
}

void foyier()
{
    if(one==0) return;
    if(two==0) return;
    if(other==0) return;

    for(int i=1;i<=one;i++)
        ans[7].push_back(1);
    ans[7].push_back(2);

    for(int i=1;i<=n;i++)
    {
        if(a[i]<=2) continue;
        if(prime(a[i]+2)&&prime(a[i]+1))
        {
            ans[7].push_back(a[i]);
            break;
        }
    }
}


int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
        if(a[i]==1) one++;
        else if(a[i]==2) two++;
    }
    other=n-one-two;

    // only other
    fot();
    fer();
    fyi();
    fero();
    fyio();
    fyier();
    foyier();

    int Max=-1;

    for(int i=1;i<=7;i++){
        int len=ans[i].size();
        Max=max(Max,len);
    }
    for(int i=1;i<=7;i++)
    {
        if(ans[i].size()==Max)
        {
            printf("%d
",ans[i].size());
            for(int j=0;j<ans[i].size();j++)
                printf("%d ",ans[i][j]);
            printf("
");
            break;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5630756.html