煤球數目
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:若第一步沒找到遞減的相鄰數字,則說明該排列已經是最後一個排列。