From 224120a35ee44efacdd4435a3d28aab0bf44df74 Mon Sep 17 00:00:00 2001 From: xingyou wu <3050128610@qq.com> Date: Mon, 7 Apr 2025 15:35:51 +0800 Subject: [PATCH] =?UTF-8?q?lanqiao=201457=20=E6=9D=A8=E8=BE=89=E4=B8=89?= =?UTF-8?q?=E8=A7=92=E5=BD=A2(=E4=BC=98=E5=8C=96=E8=A7=A3=E6=B3=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 12lanqiao/test8-2.cpp | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/12lanqiao/test8-2.cpp b/12lanqiao/test8-2.cpp index f27fcd4..32f1f3b 100644 --- a/12lanqiao/test8-2.cpp +++ b/12lanqiao/test8-2.cpp @@ -1,19 +1,40 @@ // lanqiao 1457 杨辉三角形(优化解法) -#include +#include using namespace std; const int N = 1e5 + 10; int a[N], b[N]; int main(){ - int n; cin >>n; - if(n == 1){ + int n; cin >> n; + a[0] = b[0] = 1; + if (n == 1){ cout << 1 << endl; return 0; - } + } /* 如果某一行第二个数是n,那么第三个数一定是n(n-1)/2,算到44723行 44723*44723>10亿,所以算到前44723行即可 */ - + for (int i = 3; i <= 44723; i++){ + // 对于本题的规模,使用杨辉三角模版求解会超时,由于杨辉三角是对称的 + // 所以我们只需要求解一半即可 + for(int j = 1; j <= i/2; j++){ + if (j == i/2 && i%2 == 1) b[j] = 2 * a[j - 1]; + else b[j] = a[j - 1] + a[j]; + a[j - 1] = b[j - 1]; // 更新滚动数组 + if (b[j] == n){ + // 如果找到了n, 则前i-1行, 按照等差数列计算一共有i*(i-1)/2个元素 + // 由于当前行我们是从第二个元素开始算的,所以需要+j+i + cout << i * (i - 1)/2 + j + 1 << endl; + return 0; + } + } + a[i/2] = b[i/2]; + } + // 对于超过44723行的情况,其实只需要考虑每一行的第二个元素即可,第三个元素一定越界 + // 而每一行的第二个数字正好就是行号-1,假设某一行第二个数字是n,则行号i=n+1 + // 所以到当前元素的总个数为n*(n+1)/2 + // 总的来说,这个表达式计算超过44723行时,第一次出现n的位置 + cout << n*(n+1)/2 + 2 << endl; return 0; } /* test samples -> 13