煤球数目
2016年题目的难度明显感觉比2017年简单不少。
package lanqiao.lanqiao_2016;
/**
* Created by ministrong on 2020/3/4.
*
*
煤球数目
有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:171700
*/
public class Q1_2016_7_meiqiu {
public static void main(String[] args) {
int res=0;//总共
int t=0;//每一层
for(int i=1;i<101;i++){
t=t+i;
res+=t;
}
System.out.println(res);
}
}
生日蜡烛
package lanqiao.lanqiao_2016;
/**
* Created by ministrong on 2020/3/4.
*
*
生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:26
*/
public class Q2_2016_7_shengri {
public static void main(String[] args) {
for(int i=1;i<200;i++){
int res=0;
for(int j=i;j<200;j++){
res+=j;
if(res==236) System.out.println(i);
}
}
}
}
搭积木
package lanqiao.lanqiao_2016;
/**
* Created by ministrong on 2020/3/4.
*
搭积木
小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。
搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。
下面是两种合格的搭法:
0
1 2
3 4 5
6 7 8 9
0
3 1
7 5 2
9 8 6 4
请你计算这样的搭法一共有多少种?
请填表示总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:768
*/
import java.lang.reflect.Array;
import java.util.Arrays;
/***
* 对1~9全排列,要求,a[0]<a[2]和a[3],a[1]<a[3]和a[4],a[2]<a[5]和a[6],a[3]<a[6]和a[7],a[4]<a[7]和a[8]
*/
public class Q3_2016_7_jimu {
public static int[] a=new int[]{1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
int res=0;
do{
if(isok(a)) res++;
}while(nextque());
System.out.println(res);
}
public static boolean isok(int[] a){
return a[0]<a[2] && a[0]<a[3] && a[1]<a[3] && a[1]<a[4] && a[2]<a[5] && a[2]<a[6] && a[3]<a[6] && a[3]<a[7] && a[4]<a[7] && a[4]<a[8];
}
public static boolean nextque(){
int x=-1;
for(int i=8;i>0;i--){
if(a[i]>a[i-1]){
x=i-1;
break;
}
}
if(x==-1) return false;
int y=-1;
for(int i=8;i>x;i--){
if(a[i]>a[x]){
y=i;
break;
}
}
int t=a[x];
a[x]=a[y];
a[y]=t;
Arrays.sort(a,x+1,a.length);
return true;
}
}
字典序法求全排列:以a[5]={35876}为例
1.从右到左找第一个递减的相邻数字,记下左边数的下标i:这里58第一次递减,记录5的下标为i=1。
2.从右往左找第一个比a[i]大的数字,记录其下标j:这里6是第一个比5大的,记录6的下标j=4。
3.交换a[i]和a[j]的数字,序列变成了:36875。
4.然后将下标i后面的序列从小到大排列,得到结果:36578。
ps:若第一步没找到递减的相邻数字,则说明该排列已经是最后一个排列。