C++
$\color{gold}{— > 蓝桥杯辅导课题解}$
$40分做法:$
思路:
$暴力$
$直接预处理出来前1000行的杨辉三角形,然后暴力枚举,找到x,输出即可$
$code1:$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e3 + 10;
int n = 1000;
int a[N][N];
int main() {
a[1][1] = 1;
for (int i = 2; i <= n; i ++) // 预处理
for (int j = 1; j <= i; j ++)
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
int x; cin >> x;
int cnt = 0;
for (int i = 1; i <= n; i ++) // 枚举
for (int j = 1; j <= i; j ++) {
cnt ++;
if (a[i][j] == x) {
cout << cnt;
return 0;
}
}
return 0;
}
$50分做法:$
思路:
$推公式$
$code2:$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main() {
ll n;
cin >> n;
cout << n * (n + 1) / 2 + 2;
return 0;
}
$80分做法:$
思路:
$将上面两种方法相结合$
$code3:$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e3 + 10;
typedef long long ll;
int n = 1000;
int a[N][N];
int main() {
ll x; cin >> x;
if (x > 1000 * 999 / 2) {
cout << x * (x + 1) / 2 + 2;
return 0;
}
a[1][1] = 1;
for (int i = 2; i <= n; i ++)
for (int j = 1; j <= i; j ++)
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
ll cnt = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= i; j ++) {
cnt ++;
if (a[i][j] == x) {
cout << cnt;
return 0;
}
}
return 0;
}
$满分(100分)做法:$
思路:
二分
$code4:$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int n;
ll C(int a, int b) { // 求组合数函数
ll res = 1;
for (int i = a, j = 1; j <= b; i --, j ++) {
res = res * i / j;
if (res > n) return res;
}
return res;
}
bool check(int k) {
ll l = k * 2, r = max(n, l);
while (l < r) {
ll mid = l + r >> 1;
if (C(mid, k) >= n) r = mid;
else l = mid + 1;
}
if (C(r, k) != n) return false;
cout << r * (r + 1) / 2 + k + 1;
return true;
}
int main() {
cin >> n;
for (int k = 16; ; k --)
if (check(k))
break;
return 0;
}
$ps:以上,皆为在蓝桥杯官网题库测试结果$
写得好,蓝桥杯的题目就需要这样的题解,毕竟不是以ac为目的
为什么暴力解法,预处理1000行呢?请问佬1000是怎么看的
根据时间复杂度以及空间复杂度确定的。
时间复杂度方面:暴力,这是一个两重for循环,处理1000行,已经达到了10^6的时间复杂度,要处理10000行的话,会达到10^8,有超时的风险
空间复杂度方面,1000*1000个int,具体可以看下这个题解:关于空间复杂度的解释:
https://www.acwing.com/solution/content/167748/
多谢多谢
挺了,毕竟我这种菜菜也不要正解,80分满足了
支持,以后就看你题解
这个50分做法答案不对啊
弱弱的问一下,公式咋推的,没看懂,而且这个公式为啥对小范围的数据不适用?
这公式推我应该也想不到