煤球數目 && 生日蠟燭 && 搭積木

煤球數目

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章