第10届蓝桥杯个人题解(2)——编程题

 第6题:这题据说是有规律的,每位计算,然后特判最高位就行,但是找起来很困难,而且数据范围最大才10000,所以直接暴力就行。

 附代码——

 第7题:这题是一个很基础的二叉树题,需要了解的性质为:完全二叉树的深度为n的节点个数=2^(n-1),因为题目规定根节点深度为1,所以节点个数改为2^n。每一层深度单独统计就可以,最后找出最多的节点个数就好。

 附代码——

第8题:很典型的最大公约数问题,依次找出相邻两个数的差,gcd全部的数,结果就是数列公差,长度就等于(最大值-最小值)/公差+1,另外要注意公差为0的特判,上代码。

附代码——

第9题:这题要考虑下范围要用long long,本来我是排序,然后负数相减,正数相加,剩下的大的加,小的减。后来看到了大佬的代码,感觉自己弱犇。

附代码——

第10题:这题copy大佬代码)最难的一道题,这题题量有点大。。。简单来说就是给定一组数,我们的目标是通过两种操作使得其中的绝对值最大的数达到最小,这两种操作是:

1、如果 a[i] > 0 并且 a[i - 1] 或者 a[i+1] 小于 0,我们可以将 a[i] 借给 i-1 元素和 i+1 元素,同时 a[i] 要变成 -a[i]。

2、如果 a[i] < 0 并且 a[i - 1] 或者 a[i+1] 大于 0,我们可以将 a[i-1] 和 a[i+1] 各借 abs(a[i]) 给 i 元素,之后 i 元素的值变成 -a[i] 也就是正数(a[i] 本身是小于 0 的),同时 a[i - 1] 和 a[i + 1] 要减掉 abs(a[i])。

我们考虑几种情况:

1、所有的数字都为正数或者都为负数,即所有的数字都同号。这种情况是没法借的,因为不符合操作要求,因此这种情况求出数组中绝对值最大的数即可。

2、对于 a[i],如果 a[i] 是正数,并且 a[i - 1] 和 a[i + 1] 至少有一个负数,那么我们的目标就是把那个绝对值最大的负数的绝对值缩小,这个时候如果另一边是正数,则需要考虑操作之后是否会产生新的绝对值更大的正数,比如现在有三个数:5 5 -6,如果我们把中间那个 5 按上面的操作 1 变换之后:10 -5 -1,绝对值最大数变成了 10,而之前是 6,显然不行。如果这三个数是这样的:1 5 -7,那么我们就可以按操作 1 变换:6 -5 -2,最大绝对值从 7 减小到了 6,是可行的。那么变换条件是什么呢?这里假设 a[i - 1] 是正数,a[i + 1] 是负数,那么条件可以写成:a[i - 1] + a[i] < abs(a[i + 1])。而如果 a[i - 1] 和 a[i + 1] 都是负数的时候,当两边的绝对值有一个大于 a[i] 时,就可以进行操作 1 变换。

3、对于 a[i] 是负数的时候,如果 a[i - 1] 是负数, a[i+1] 是正数,那么确保 a[i + 1] > abs(a[i] + a[i-1]),就可以进行操作 2 变换,如果两边都是正数则只要有一边的值大于 abs(a[i]) 时就可以进行操作 2 变换。

ps:我最开始是考虑用dp做的,但是1没时间2没想出dp方程,现在看了大佬的思路感觉很有意思。

附代码——

猜你喜欢

转载自www.cnblogs.com/zxcfInight/p/10640186.html
今日推荐