您的位置:首页 > 其它

cf 131 DIV2 B

2012-07-31 16:11 369 查看
MOD3的处理 是考虑删除一个数 还是两个数

在%=1的情况下 从小到大找到一个%3等于1的然后去掉 输出答案

找不到的情况 考虑去掉两个数 因为%3=2的数去掉两个 就相当于一个%3等于1的数

同理适用于%=2的情况下

屎代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stack>
#include <iostream>
int num[100005],knum[100005];
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
using namespace std;
int main()
{
int n,m,a,b;
int sum=0;
int sign1,sign2,i,sign;
sign=0;
cin>>n;
for( i=0;i<n;i++)
{
cin>>num[i];
sum+=num[i];
}
qsort(num,n,sizeof(int),cmp);
for(i=0;i<n;i++)
knum[i]=num[i]%3;
if(num[0]==0)
{
cout<<"0"<<endl;
}
else if(num[n-1]==0&&sum%3==0)
{
for(int i=0;i<n;i++)
cout<<num[i];
cout<<endl;
}
else if(sum%3==1&&num[n-1]==0)
{
int ok=0;
for( i=n-1;i>=0;i--)
if(knum[i]==1)
{
ok=1;
sign1=i;
break;
}
if(ok)
{
for( i=0;i<n;i++)
if(i!=sign1)
{
sign++;
if(sign==1&&num[i]==0)
{
cout<<"0";
break;
}
cout<<num[i];
}
cout<<endl;
}
else
{
for( i=n-1;i>=0;i--)
if(knum[i]==2)
{
sign1=i;
ok=1;
break;
}
if(ok==1)
for(i--;i>=0;i--)
if(knum[i]==2)
{
sign2=i;
ok=2;
break;
}
if(ok==2)
{
for(i=0;i<n;i++)
if(i!=sign1&&i!=sign2)
{
sign++;
if(sign==1&&num[i]==0)
{
cout<<"0";
break;
}
cout<<num[i];
}
cout<<endl;
}
else
cout<<"-1"<<endl;
}
}
else if(sum%3==2&&num[n-1]==0)
{
int ok=0;
for( i=n-1;i>=0;i--)
if(knum[i]==2)
{
ok=1;
sign1=i;
break;
}
if(ok)
{
for( i=0;i<n;i++)
if(i!=sign1)
{
sign++;
if(sign==1&&num[i]==0)
{
cout<<"0";
break;
}
cout<<num[i];
}
cout<<endl;
}
else
{
for( i=n-1;i>=0;i--)
if(knum[i]==1)
{
sign1=i;
ok=1;
break;
}
if(ok==1)
for(i--;i>=0;i--)
if(knum[i]==1)
{
sign2=i;
ok=2;
break;
}
/*else if(ok==1&&num[sign1]==4)
for(i--;i>=0;i--)
if(num[i]==4)
{
sign2=i;
ok=2;
break;
}*/
if(ok==2)
{
for(i=0;i<n;i++)
if(i!=sign1&&i!=sign2)
{
sign++;
if(sign==1&&num[i]==0)
{
cout<<"0";
break;
}
cout<<num[i];
}
cout<<endl;
}
else
cout<<"-1"<<endl;
}
}
else
cout<<"-1"<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: