蓝桥杯B组 杨辉三角
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯B组 杨辉三角
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
這道題得斜著看,可以發現如下規律:
1.題目要求的是N第一次出現的數字,那么左邊的優先于右邊的,所以可以只看一半。
2.搜索順序:在下的斜行優于在上的斜行
3.C(16,32)< 10^9 < C(17,34) ,故我們搜索的斜行枚舉到16即可,通過 C(k , 2k)在計算機上試一下即可知道。
4.通過一個循環來枚舉每一斜行,每個斜行用二分法來檢索N
5.還需要一個方法來求C( n , k ),這個直接求解即可,先分子除以分母,在乘到總數里
6.輸出:通過觀察可發現在 C(n,k) 這行?之前有n行,既有(1+n)*n / 2 個數,該數在該行的第 K+1 個,即該數第一次出現是在 (1+n)*n / 2 + K + 1 個數。
import java.util.*; class Main{static int n;static long c(long a,long b) {long res=1;for(long i=a,j=1;j<=b;j++,i--) {res=res*i/j;//先除在乘起來,不然會爆//該方法用在了check中,為了比較c(mid,k)與n的大小,一旦大于n結果自然知曉,也無需在往下計算 if(res>n) return res;}//System.out.println("c: "+res);return res;}static boolean check(int k) {//System.out.println("k1: "+k);long l=2*k,r=n;long res=0;while(l<=r) {//System.out.println("k2: "+k);long mid=l+r>>1;res=c(mid,k); if(res>n) r=mid-1;else if(res<n) l=mid+1;else {//if(n<2*k) return false;//n要大于2KSystem.out.println((mid+1)*mid/2+k+1);return true;}}return false;}public static void main(String args[]) {Scanner scan=new Scanner(System.in);n=scan.nextInt();for(int k=16;k>=0;k--) {if(check(k))break;}} }反思:
1.要注重臨界值的判斷,例如此處的 l <= r,當 n 就是該斜行中的最大值時,最終 l=mid=r,所以循環條件應該是 l <= r。若為 l < r,那么當 l = r 時就退出循環導致查找失敗。?
2.當 n < 2k 時,n一定小于 C(k,2k) ,則沒必要進行該斜行的檢索,也不會進入循環,也達到了一個篩選的作用。
總結
以上是生活随笔為你收集整理的蓝桥杯B组 杨辉三角的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php广告统计代码,JS广告、统计代码如
- 下一篇: 图论1:哥尼斯堡七桥问题的证明