题意:
给你n个0~9的数字,可以不全部都用,问你能够组成同时被2、3、5整除的最大的数是多少。
思路:
构造。先统计各个数字出现的次数,和各个数字之和。然后根据性质:能同时被2、5整除的数的个位必定为0。能被3整除的数的各个数位上的数字之和能被3整除。那么我们首先判断下输入是否有0,若无直接输出-1。若有,则判断各个数位上的数字之和是否能被3整除,即sum%3==0?,若不能,则进行如下操作:
1若sum%3==1,则选择一个1或4或7来删除,使sum%3==0,若没有1或4或7,则选择两个2或5或8来删除,若不够,则输出-1。
2若sum%3==2,则选择一个2或5或8来删除,使sum%3==0,若没有2或5或8,则选择两个1或4或7来删除,若不够,则输出-1。
#include<cstdio>
#include<cstring>
int dight[15];
int n,a,sum;
void Print(){
if(sum>0){
for(int i=9;i>=0;i--){
if(dight[i]){
for(int j=0;j<dight[i];j++){
printf("%d",i);
}
}
}
}
else printf("0");
}
int main(){
scanf("%d",&n);
memset(dight,0,sizeof(dight));
sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a);
dight[a]++;
sum+=a;
}
if(dight[0]){
if(sum%3==0) Print();
else if(sum%3==1){
for(int i=1;i<=7;i+=3){
if(dight[i]){
dight[i]--;
sum-=i;
break;
}
}
if(sum%3==0) Print();
else{
bool flag=false;
for(int i=2;i<=8;i+=3){
if(dight[i]>=2){
dight[i]-=2;
sum-=i*2;
break;
}
for(int j=i+3;j<=8;j+=3){
if(dight[i]&&dight[j]){
dight[i]--,dight[j]--;
sum-=i,sum-=j;
flag=true;
break;
}
}
if(flag) break;
}
if(sum%3==0) Print();
else printf("-1");
}
}
else if(sum%3==2){
for(int i=2;i<=8;i+=3){
if(dight[i]){
dight[i]--;
sum-=i;
break;
}
}
if(sum%3==0) Print();
else{
bool flag=false;
for(int i=1;i<=7;i+=3){
if(dight[i]>=2){
dight[i]-=2;
sum-=i*2;
break;
}
for(int j=i+3;j<=7;j+=3){
if(dight[i]&&dight[j]){
dight[i]--,dight[j]--;
sum-=i,sum-=j;
flag=true;
break;
}
}
if(flag) break;
}
if(sum%3==0) Print();
else printf("-1");
}
}
}
else printf("-1");
printf("\n");
return 0;
}