蓝桥杯B组 杨辉三角
題目分析
這道題得斜著看,可以發(fā)現(xiàn)如下規(guī)律:
1.題目要求的是N第一次出現(xiàn)的數(shù)字,那么左邊的優(yōu)先于右邊的,所以可以只看一半。
2.搜索順序:在下的斜行優(yōu)于在上的斜行
3.C(16,32)< 10^9 < C(17,34) ,故我們搜索的斜行枚舉到16即可,通過 C(k , 2k)在計(jì)算機(jī)上試一下即可知道。
4.通過一個(gè)循環(huán)來(lái)枚舉每一斜行,每個(gè)斜行用二分法來(lái)檢索N
5.還需要一個(gè)方法來(lái)求C( n , k ),這個(gè)直接求解即可,先分子除以分母,在乘到總數(shù)里
6.輸出:通過觀察可發(fā)現(xiàn)在 C(n,k) 這行?之前有n行,既有(1+n)*n / 2 個(gè)數(shù),該數(shù)在該行的第 K+1 個(gè),即該數(shù)第一次出現(xiàn)是在 (1+n)*n / 2 + K + 1 個(gè)數(shù)。
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;//先除在乘起來(lái),不然會(huì)爆//該方法用在了check中,為了比較c(mid,k)與n的大小,一旦大于n結(jié)果自然知曉,也無(wú)需在往下計(jì)算 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,當(dāng) n 就是該斜行中的最大值時(shí),最終 l=mid=r,所以循環(huán)條件應(yīng)該是 l <= r。若為 l < r,那么當(dāng) l = r 時(shí)就退出循環(huán)導(dǎo)致查找失敗。?
2.當(dāng) n < 2k 時(shí),n一定小于 C(k,2k) ,則沒必要進(jìn)行該斜行的檢索,也不會(huì)進(jìn)入循環(huán),也達(dá)到了一個(gè)篩選的作用。
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯B组 杨辉三角的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php广告统计代码,JS广告、统计代码如
- 下一篇: 图论1:哥尼斯堡七桥问题的证明