本题很容易想到用斐波那契数列构建,但是fib很快就会超过1e9,数据项并不够。

所以:

  • 不可能找不到三角形,只能推迟,但无法阻止
  • 时间复杂度提示
>>> from math import log2
>>> log2(100000)
16.609640474436812

比赛的时候我想到了这里,但当时以为就是要让i循环走到16之后即可,所构建的数据也让i循环走到了21。但其实这是不够的:因为对于每个i循环,k并没有走次。

所以为了让次数尽可能多,必须降序构建。

最优的构造应当是降序的fib序列。

fib = [1, 1]
while fib[-1]+fib[-2] < 1e9:
    fib.append(fib[-1]+fib[-2])
fib.reverse()
n = int(input())
sz = len(fib)
for i in range(n):
    print(fib[i] if i < sz else 1, end=' ')

这也是一种比较有趣的写法

#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld ", (x))
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
int main() {
    int n;
    scanf("%d", &n);
    int x = 1 << 29;
    for(int i = 1;i <= n;i++){
        printf("%d ", x);
        if(x > 1) x >>= 1;
    }
    return 0;
}