您的位置:首页 > 其它

codeforces-305A Strange Addition

2016-07-20 14:42 344 查看
题目链接:点击打开链接

之前一直理解错题意,以为两个数字里面任意一个数含有0就能相加,结果各种wa。。。

其实题目说的意思是两个数如果在任意十进制位至少有一个数含有0才可以相加,比如505和50可以相加(50可以看成050,在个十百位上505和050这两个数至少一方含有0),而50和25不能相加(在十位上两方都不含有0),理解清楚题意后直接暴力求解就可以了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=105;
int a[maxn];
int ans[maxn];
bool vis[maxn];

int main()
{
int n;
while(cin>>n)
{
memset(vis,false,sizeof vis);
int maxpos=-1,low=inf;
int num=0;
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
int temp=a[i],t=0;
while(temp)
{
temp/=10;
t++;
}
maxpos=max(maxpos,t);
if(a[i]==0)
{
ans[num++]=a[i];
maxpos=max(maxpos,1);
//low=min(low,1);
}
}
//cout<<"maxpos="<<maxpos<<endl;
for(int i=0;i<maxpos;i++)
{
for(int j=0;j<n;j++)
{
if(vis[j]) continue;
int temp=a[j];
for(int k=0;k<i;k++)
temp/=10;
if(temp!=0&&temp%10==0)
{
temp/=10;
bool flag=true;
while(temp)
{
if(temp%10==0) { flag=false; break; }
temp/=10;
}
if(flag)
{
low=min(low,i+1);
ans[num++]=a[j];
vis[j]=true;
break;
}
}
}
}
//cout<<"low="<<low<<endl;
if(num==0)
{
puts("1");
printf("%d\n",a[0]);
continue;
}
for(int i=0;i<n;i++)
{
int temp=a[i],t=0,k=0;
if(a[i]==0) continue;
while(temp)
{
if(temp%10) k++;
temp/=10;
t++;
}
if(t==k&&k<=low)
{
ans[num++]=a[i];
break;
}
}
printf("%d\n",num);
for(int i=0;i<num;i++)
{
if(i==0) printf("%d",ans[i]);
else printf(" %d",ans[i]);
if(i==num-1) puts("");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: