杨辉三角形——蓝桥杯

杨辉三角形

  • 题目
  • 对于20%的样例
  • AC代码


题目

杨辉三角形——蓝桥杯_第1张图片

样例输入:

6

样例输出:

13

这道题对于我个人来说挺难的,因为没找到其中更深的规律,当时也没做出来。

对于20%的样例

如果将杨辉三角形变成以下模样:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1

可以发现第i行第j列的值=第i-1行第j列的值+第i-1行第j-1列的值

#include
using namespace std;

#define ll long long int
const int maxn=10;

ll dp[maxn][maxn];
ll t[(maxn+1)*maxn/2+2]; //将数组的数排成一列
int main(){
	ll n;
	cin>>n;
	dp[0][0]=1;
	ll k=1;
	
	for(ll i=1;i<=maxn;i++){
		for(ll j=1;j<=i;j++){
			dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
			t[k]=dp[i][j];
			k++;
		}
	}
//	for(ll i=1;i<=maxn;i++){
//		for(ll j=1;j<=i;j++){
//			cout<
//		}
//		cout<
//	}
	for(ll i=1;i<=k;i++){
        if(t[i]==n){
            cout<<i;
            break;
        }
    }
	return 0;
} 

然而所有测评用例,用上面这种方法会超时,看了大佬写的AC代码,发现自己的脑壳不行。


AC代码

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1

还是这个表格,从列的角度去观察规律
第1列,永远都是1
第2列,从0开始+1的序列,也就是0 1 2 3 … n
第3列,1+2+3+…的累加序列,也就是从第3行开始,1=1,1+2=3,1+2+3=6,…

好像发现了什么,1e9这么大的数如果按第2列数,那就是数到1e9+1,又超时了

那第3列
0
0+0
0+0+1
0+0+1+2
0+0+1+2+3
0+0+1+2+3+4
0+0+1+2+3+4+5
0+0+1+2+3+4+5+6
0+0+1+2+3+4+5+6+7+…+n

1+2+3+4+…+n=(n+1)*n/2>1000000000
解得n>=44721,arr[44721]不超界,第1行,第2行为0,所以n>=44723

当第3个值已经大于1000000000,后面的数我们也不用再去运算了,所以直接运用当前行的第2个值(1+n)*n/2+2

#include
using namespace std;

#define ll long long int
const int maxn=44725;
ll arr[maxn];
int main(){
	arr[0]=1;
	ll k=1;
	ll n;
	cin>>n;
	if(n==1){
		cout<<"1";
		return 0;
	}
	for(int i=1;i<maxn;i++){
		for(int j=i;j>=1;j--){
			arr[j]+=arr[j-1];  
			if(arr[j]==n){
				cout<<(k+i+1-j);  
				return 0;
			}
		}
		k+=(i+1);
	}
	cout<<((n+1)*n/2)+2; 
	return 0;
} 

你可能感兴趣的:(刷题,c++,算法)