第十届蓝桥杯省赛B组

思路:
边输入边处理,我们容易知道,每一行的最后一个数的下标都是等于(2^n)-1,比如第二行的最后一个数等于2^2-1=3,第三行的最后一个数等于2^3-1=7,用deep表示当前深度,从当前这行的第一项加到最后一项然后和最大值max_sum比较。
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <algorithm> 5 #include <queue> 6 #include <set> 7 8 using namespace std; 9 10 typedef long long LL; 11 typedef pair<int, int>PII; 12 13 char a[105]; 14 int b[30]; 15 int res; 16 17 int main() 18 { 19 int n; 20 cin >> n; 21 22 int maxsum = -1e9; 23 int resdeep = 1; 24 int A[100010]; 25 int deep = 1;//深度 26 int sum = 0;//每行的和 27 for (int i = 1; i <= n; i++) 28 { 29 cin >> A[i]; 30 sum += A[i]; 31 if (i == pow(2, deep) - 1) 32 { 33 if (maxsum < sum)//注意不要取等号,因为题目要最小的深度 34 { 35 maxsum = sum; 36 resdeep = deep; 37 } 38 } 39 40 sum = 0;//搜完一层sum变为0,接着搜下一层 41 deep++;//下一层 42 } 43 44 cout << resdeep << endl; 45 46 return 0; 47 48 }

思路
等差数列项数的公式为 ( a n − a 1 ) / d + 1,其中a n为等差数列的末项,在序列中就是最大值,a 1 为等差数列的首项,在序列中就是最小值
所以要求序列最短的话,因为最大值和最小值已经固定,要求的就是公差 d dd 的最大值
因为等差序列可以表示为 a 1 , a 1 + d , a 1 + 2 d , a 1 + 3 d , . . . . , a 1 + n d
可以观察到等差数列的每一项和第一项的差值都是 d 的倍数,所以求 d 的最大值就是求序列给出的项数差值的最大公约数
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <set> using namespace std; typedef long long LL; typedef pair<int, int>PII; int n; int a[100010]; int gcd(int a, int b) { int c = a % b; while (c) { a = b; b = c; c = a % b; } return b; } int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + 1 + n); int d = a[2] - a[1]; for (int i = 3; i <= n; i++) d = gcd(d, a[i] - a[i - 1]); if (d == 0) cout << n << endl;//公差为0,说明数列为常数列 else cout << (a[n] - a[1]) / d + 1 << endl; return 0; }

浙公网安备 33010602011771号