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\n",ans[i].size()); for(int j=0;j<ans[i].size();j++) printf("%d ",ans[i][j]); printf("\n"); break; } } return 0; }