您的位置:首页 > 其它

codeforces 214B

2014-08-04 11:39 218 查看
【题意描述】

本题就是在给定的n个整数中选出若干个数字组成一个最大数并且能被2,3,5整除。

【解题思路】

我们在求最大数是否能被2,3,5整除时,首先应该满足n个数字里面必须有0,如果没有,是不能构成最大数的。当有0以后,我们需要了解一个知识,那就是一个数字乘以10的n次方后除3的余数仍然是原来那个数字。那么我们就可以研究这n个数字与3的关系,进而研究整体。如果这n个数字加起来的整体之和除3的余数为1,那么我们需要删除一个余数为1的数(该数尽量小),或者删除两个余数为2的数字(这两个数字尽量小);当和除3的余数为2时,我们需要删除一个余数为2的数字(该数尽量小),活着的删除两个余数为1的数字(这两个数字尽量小)。

【AC代码】

代码1:优势,代码简单易读;缺点:所开数组过大,不节约空间

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define max 100005
int num[max];
int l[max];
int vis[max];
int num_zero;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
while(cin>>n)
{
int judge=0;
memset(vis,1,sizeof(vis));
for(int i=0;i<n;i++)
{
cin>>num[i];
if(num[i]==0) judge=1;  //记录0的个数
}
if(!judge) {cout<<-1<<endl;continue;}
else
{
sort(num,num+n,cmp);//排序
int sum_total=0;
int left_one=0,left_zero=0,left_two=0;
for(int i=0;i<n;i++)
{
l[i]=num[i]%3;
if(l[i]==2)
left_two++;
else if(l[i]==1)
left_one++;
else if(l[i]==0)
left_zero++;
sum_total+=l[i];
}
int  sum_left=sum_total%3;
if(sum_left==0)//直接被整除
{
if(num[0]==0)  cout<<0<<endl;
else
for(int i=0;i<n;i++)
cout<<num[i];
cout<<endl;
}
else if(sum_left==1)//余数为1
{

if(left_one==0)
{
for(int i=n-1,count1=0;i>=0;i--)
{
if(l[i]==2)  {count1++;vis[i]=0;}
if(count1==2)   break;
}
}
if(left_one!=0)
{
for(int i=n-1;i>=0;i--)
if(l[i]==1){vis[i]=0;break;}
}
int count_vis=0;
for(int i=0;i<=n-1;i++)//寻找最后剩下的数字是否有正数
if(vis[i]&&num[i]>0) count_vis++;
if(count_vis==0)  cout<<0<<endl;
else
{for(int i=0;i<n;i++)
if(vis[i]) cout<<num[i];
cout<<endl;
}
}
else if(sum_left==2)
{
if(left_two!=0)
{
for(int i=n-1;i>=0;i--)
if(l[i]==2){vis[i]=0;break;}
}
if(left_two==0)
{
for(int i=n-1,count2=0;i>=0;i--)
{
if(l[i]==1) {count2++;vis[i]=0;}
if(count2==2) break;
}
}
int count_vis1=0;
for(int i=0;i<n;i++)
if(vis[i]&&num[i]>0) count_vis1++;
if(count_vis1==0)  cout<<0<<endl;
else
{
for(int i=0;i<n;i++)
if(vis[i]) cout<<num[i];
cout<<endl;
}
}

}
}
return 0;
}


代码2:优点:所开空间小,技巧性强

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
int n,d[10];
while(scanf("%d",&n)!=EOF)
{
int i,j,sum=0,a;
memset(d,0,sizeof(d));
for(i=0; i<n; i++)
{
scanf("%d",&a);
sum+=a;
d[a]++;
}
if(d[0]==0) printf("-1\n");
else
{
int flag=0;
if(sum%3==1)
{
if(d[1]+d[4]+d[7])
{
for(i=1; i<=7; i+=3)
if(d[i])   {d[i]--,sum-=i;break;}
}
else if(d[2]+d[5]+d[8]>=2)
for(j=1,i=2; i<=8; i+=3)
while(d[i]&&j<=2)
{d[i]--,sum-=i,j++;}
}
if(sum%3==2)
{
if(d[2]+d[5]+d[8])
{
for(i=2; i<=8; i+=3)
if(d[i])   {d[i]--,sum-=i;break;}
}
else if(d[1]+d[4]+d[7]>=2)
for(j=1,i=1; i<=7; i+=3)
while(d[i]&&j<=2) {d[i]--,sum-=i,j++;}
}

if(!flag)
{
if(d[1]+d[2]+d[3]+d[4]+d[5]+d[6]+d[7]+d[8]+d[9])
{
for(i=9; i>=0; i--)
while(d[i]--) printf("%d",i);
printf("\n");
}
else printf("0\n");
}
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: