LQ0152 杨辉三角形模拟

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0152 杨辉三角形模拟相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2021初赛 C++ B组I题

题目描述
下面的图形是著名的杨辉三角形:

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, …
给定一个正整数N,请你输出数列中第一次出现N 是在第几个数?

输入描述
输入一个整数 N。

输出描述
输出一个整数代表答案。

输入输出样例
示例 1
输入

6

输出

13

评测用例规模与约定
对于 20%​​ 的评测用例,1≤N≤10​;
对于所有评测用例,1≤N≤1000000000。

问题分析
用模拟法做了一个题解。
对于多输入的测试数据,使用此方法会TLE(超时),可以通过50%的测试样例。

AC的C++语言程序如下:

/* LQ0152 杨辉三角形 */

#include <iostream>

using namespace std;

typedef long long LL;
const int LINE = 44721;
LL n, k, line, a[LINE + 1] = 0;

int main()

    cin >> n;
    a[0] = k = 1;
    if (n == 1)
        cout << 1 << endl;
    else 
        for (line = 1; line <= LINE; line++) 
            for (int i = line; i >= 1; i--) 
                a[i] += a[i - 1];
                if (a[i] == n) 
                    cout << k + line - i + 1 << endl;
                    return 0;
                
            
            k += line + 1;
        
        cout << n * (n + 1) / 2 + 2;
    

    return 0;

超时的C++程序如下:

/* LQ0152 杨辉三角形 */

#include <iostream>
#include <cstring>

using namespace std;

typedef long long LL;
const int LINE = 44721;
LL n, k, line, a[LINE + 1];

int main()

    int t;
    cin >> t;
    while (t--) 
        memset(a, 0, sizeof a);

        cin >> n;
        a[0] = k = 1;
        if (n == 1)
            cout << 1 << endl;
        else 
            for (line = 1; line <= LINE; line++) 
                for (int i = line; i >= 1; i--) 
                    a[i] += a[i - 1];
                    if (a[i] == n) 
                        cout << k + line - i + 1 << endl;
                        goto end;
                    
                
                k += line + 1;
            
            cout << n * (n + 1) / 2 + 2;
        
        end:
            ;
    

    return 0;

以上是关于LQ0152 杨辉三角形模拟的主要内容,如果未能解决你的问题,请参考以下文章

Python案例:打印杨辉三角形

杨辉三角形

课堂作业之杨辉三角形

杨辉三角形 递归与非递归

用java编写金字塔型的杨辉三角形程序

蓝桥杯 基础练习 杨辉三角形