7-60 致命的珠宝 (10分)
7-60 致命的珠宝 (10分)
Mini使用神风无影来到了大魔王所居住的洞穴,门口却有着险恶的机关。门上有着N个宝珠,每个宝珠都有一个数字。传说,只要宝珠里的两颗珠撞在一起后就会发出奇异的光彩,但发出的光彩有可能是致命的,也有可能是打开前进之路的钥匙。Mini询问老者后,得知要想打开这扇门,就得找出两颗珠宝,使这两颗珠宝撞在一起后产生的能量值最接近16。
两颗珠宝撞在一起以后产生的能量值的计算方法是:将两个珠宝所代表的数字转换为7进制的数后,一一对照这两个七进制数的每一位,若相同,则结果为0否则为1。
如:两颗珠子所代表的数为18和370,将这两个数转化为7进制后是24和1036,对于高位不足的数,采取高位添‘0’的方法,即两个数为0024,1036。最后得到的能量值C为1011,再将C当作二进制数转换为十进制数。那么转换后的C就为这两个珠撞在一起以后所产生的能量值。
输入格式:
第一行一个数N,表示宝珠的数量(2<=N<=1200)。 第二行N个数,每个数用空格隔开,每个数表示第I个宝珠所代表的数字(0<=每个数<=11111)。
输出格式:
一个数,代表你所找到的最接近16的能量值。
输入样例:
5
18 370 45 36 78
输出样例:
15
#include<stdio.h>
#include<math.h>
int f(int x,int y)
{
int a[5]={0};
int b[5]={0};
int count_a=0, count_b=0;
while(x)
{
a[count_a++]=x%7;
x/=7;
}
while(y)
{
b[count_b++]=y%7;
y/=7;
}
count_a=count_a>count_b?count_a:count_b;
int i;
for(i=0;i<count_a;i++)
{
a[i]=a[i]^b[i];
}
int sum=0;
for(i=count_a-1;i>=0;i--)
{
sum=sum*2+a[i];
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
int i;
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
int max=0;
int j;
int temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
temp=f(a[i],a[j]);
if(fabs(max-16)>fabs(temp-16))
max=temp;
}
}
printf("%d\n",max);
return 0;
}