2014年JavaA组

1.猜年龄
暴力枚举。注意题中信息:年龄差不超8岁

public class Main
{
 	public static void main(String args[])
 	{
  		for(int i=1;;i++)
  		{
   			for(int j=i+1;j<=i+8;j++)
   			{
    				if((i*j)/(i+j)==6 && (i*j)%(i+j)==0) 
    				{System.out.println(i+" "+j);return;}
   			}
  		}
 	}
}

答案:10.

2.李白打酒
搜索+回溯
每一次都面临两种情况,遇花或遇店,选择一种情况往下搜索试探,然后再回溯,试探另一种情况。
回溯也就是return的出口:遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。也就是遇店5次,遇花9次,还剩一斗,结束。也就是flower=5 && house=9 && n=1,return;

public class Main
{
 	static int cnt=0;
 	public static void main(String args[])
 	{
  		f(2,0,0);
  		System.out.println(cnt);
 	}
 	static void f(int n,int flower,int house)//n为当前酒的斗数,flower为遇花的次数,house为遇店的次数
 	{
  		if(house>5||flower>9) return;
  		if(flower==9&&house==5&&n==1) {
   			cnt++; return;
  		}
  		f(n-1,flower+1,house);
  		f(2*n,flower,house+1);
 	}
}

答案:14

3.神奇算式
暴力枚举,把四个数枚举出来,判断成立的情况即可。

public class Main
{
 	static int cnt=0;
 	public static void main(String args[])
 	{
  		for(int a=1;a<=9;a++)
  		{
   			for(int b=0;b<=9;b++)
   			{
    				if(b!=a)
    				for(int c=0;c<=9;c++)
    				{
     					if(c!=a&&c!=b)
     					for(int d=0;d<=9;d++)
     					{
      						if(d!=c&&d!=b&&d!=a)
      						{
       							int[] temp = {a,b,c,d};
       							int num1,num2;
       							if(b!=0) {  //第一个数是1位,第二个数是3位,去掉和第一个数是3位,第一个数是1位重复的情况
        			num1=a;num2=b*100+c*10+d;f(num1,num2,temp);
       				}
       							if(c!=0)
       							{
        							num1=a*10+b;num2=c*10+d;
        							if(num1<num2) f(num1,num2,temp); //保证第一个数小于第二个数,去掉交换重复的情况
       							}
      						}
     					}
    				}
   			}
  		}
  		System.out.println(cnt);
 	}
 	static void f(int n1,int n2,int arr[])
 	{
  		int s = n1*n2;
  		if(s<1000) return; //乘积是3位数
  		int[] temp = new int[4];
  		int index=0;
  		while(s>0)
  		{
   			temp[index++]=s%10;
   			s=s/10;
  		}
  		java.util.Arrays.sort(arr);
  		java.util.Arrays.sort(temp);
  		for(int i=0;i<4;i++)
  		{
   			if(arr[i]!=temp[i]) return;
  		}
  		cnt++;
  		System.out.println(n1+" * "+n2+" = "+n1*n2);
 	}
}

输出:
15 * 93 = 1395
21 * 60 = 1260
21 * 87 = 1827
27 * 81 = 2187
30 * 51 = 1530
3 * 501 = 1503
3 * 510 = 1530
35 * 41 = 1435
6 * 201 = 1206
6 * 210 = 1260
8 * 473 = 3784
9 * 351 = 3159
12

4.写日志
答案:n%3+1

5.锦标赛

6.六角填数
全排列+判断
在这里插入图片描述

public class Main
{
 
 	public static void main(String args[])
 	{
  		int[] a = new int[] {2,4,5,6,7,9,10,11,12};
  		mySort(a,0);
 	}
 	static void mySort(int a[],int k)  // 全排列
 	{
  		if(k==a.length)
  		{
   			if(check(a)) print(a);
   			return ;
  		}
  		for(int i=k;i<a.length;i++)
  		{
   			{int t=a[i]; a[i]=a[k]; a[k]=t;}
   			mySort(a,k+1);
   			{int t=a[i]; a[i]=a[k]; a[k]=t;}
  		}
 	}
 	static boolean check(int a[])  //判断
 	{
  		int n1 = a[0]+a[1]+a[2]+8;
  		int n2 = 1+a[0]+a[3]+a[5];
  		if(n1!=n2) return false;
  		int n3 = 1+a[1]+a[4]+a[8];
  		if(n2!=n3) return false;
  		int n4 = a[5]+a[6]+a[7]+a[8];
  		if(n3!=n4) return false;
  		int n5 = 8+a[3]+a[6]+3;
  		if(n4!=n5) return false;
  		int n6 = a[2]+a[4]+a[7]+3;
  		if(n5!=n6) return false;
  		return true;
 	}
 	static void print(int a[])
 	{
  		for(int x=0;x<a.length;x++)
   			System.out.print(a[x]+" ");
  		System.out.println();
 	}
}

答案:10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值