第十届蓝桥杯省赛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;

}

 

posted @ 2021-04-14 09:10  彦辰kkkkk  阅读(98)  评论(0)    收藏  举报