2021牛客寒假算法基础集训营2 : J 牛牛想要成为hacker

J 牛牛想要成为hacker

题目链接

  一道有意思的构造题,依据题意来说得构造尽可能多的且尽可能连续的不能组成三角形的三元组。那么可以使得三条边无法构成三角形的一个条件就是两边之和小于等于第三边,从这个条件我们可以寻找到一些思路。①号边 + ②号边 <= ③号边,②号边 + ③号边 <= ④号边,这是一个我们最终构造的序列中可能的一种情况,依据这样的情况,就可以联想到斐波那契数列。

  那么假设整个序列是斐波那契数列的话,我们任意挑三条边出来,都很容易可以得知,怎么选都是非法的三角形,那么将达到最大复杂度,是最理想的情况。但是问题就在于这个题目给了数据范围不能超过 1 0 9 10^9 109,那么我们直接先跑个程序算一下,大概n == 40多的时候会超过 1 0 9 10^9 109。那么前面 40 40 40 个左右放斐波那契,后面该放什么好呢,我们可以知道,斐波那契数列两个数的差距是会越来越大的,最小的差距就是前两项。那么如果我们让40项后面后面都放1,前两项的差距又大于1,且首项大于等于2,这样在 i i i 40 40 40 之前的时候无论 j j j , k k k 选什么都无法构成三角形了。

  那么此时来算一算复杂度。 n < = 40 n <= 40 n<=40时,复杂度达到最大,无需继续计算。 n > 40 n>40 n>40时,复杂度为稳定的 O ( n 2 ∗ 20 ) O(n^2 * 20) O(n220) (会略小于这个值,但只会小一点点),那么根据题目的要求复杂度要大于等于 m i n ( C n 3 , n 2 ⌊ l o g 2 n ⌋ ) min(C^3_n, n^2⌊log_2^n⌋) min(Cn3,n2log2n),根据计算或者估计都可得当 n > 40 n>40 n>40 , m i n ( C n 3 , n 2 ⌊ l o g 2 n ⌋ ) = n 2 ⌊ l o g 2 n ⌋ min(C^3_n, n^2⌊log_2^n⌋) = n^2⌊log_2^n⌋ min(Cn3,n2log2n)=n2log2n。此时显然 O ( n 2 ∗ 20 ) O(n^2 * 20) O(n220) 满足要求。

代码实现

#include <iostream>
#include <cstdio>
using namespace std;

int n;
int ans[100000];

void init() {
    ans[1] = 2, ans[2] = 3;
    for (int i = 3; i <= 40; i++) ans[i] = ans[i - 1] + ans[i - 2];
    for (int i = 41; i <= n; i++) ans[i] = 1;
    for (int i = 1; i <= n; ++i) printf("%d ", ans[i]);
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    scanf("%d", &n);
    init();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值