美文网首页
ZJU 3768 Continuous Login

ZJU 3768 Continuous Login

作者: digiter | 来源:发表于2014-04-07 15:46 被阅读0次

数学找规律的题,先暴力打表观察有什么规律,发现每个数只需要三个以内的三角形数的和就可以表示。
用限制步数的DFS搜索,到最后一步时加上二分优化。
打表是很重要的。

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#define OUT(x) cerr << #x << ": " << (x) << endl
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define SZ(x) ((int)x.size())
using namespace std;
typedef long long LL;

int points(int x) {
    return x * (x + 1) / 2;
}
vector<int> tri;

void output(const vector<int>& out) {
    for (int i = 0; i < SZ(out); ++i) {
        if (i) printf(" ");
        printf("%d", out[i]);
    }
    printf("\n");
}

bool dfs(int N, int cnt, int offset, vector<int>* ans) {
    if (cnt == 1) {
        int k = lower_bound(tri.begin() + offset, tri.end(), N) - tri.begin();
        if (k < SZ(tri) && tri[k] == N) {
            ans->push_back(k);
            output(*ans);
            ans->pop_back();
            return true;
        } else {
            return false;
        }
    }

    for (int i = offset; i >= 0; --i) {
        ans->push_back(i);
        if (dfs(N - tri[i], cnt - 1, i, ans)) {
            return true;
        }
        ans->pop_back();
    }
    return false;
}

int main() {
    tri.reserve((int)sqrt(2.0 * 123456789));
    for (int i = 0; points(i) <= 123456789; ++i) {
        tri.push_back(points(i));
    }

    int T, N;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &N);
        vector<int> ans;
        int offset = upper_bound(tri.begin(), tri.end(), N) - tri.begin() - 1;
        for (int cnt = 1; cnt <= 3; ++cnt) {
            if (dfs(N, cnt, offset, &ans)) break;
        }
    }
    return 0;
}

相关文章

  • ZJU 3768 Continuous Login

    数学找规律的题,先暴力打表观察有什么规律,发现每个数只需要三个以内的三角形数的和就可以表示。用限制步数的DFS搜索...

  • Linux Notes

    1.ZJU镜像源: 访问mirrors.zju.edu.cn查看更多信息 2.runlevel改变: 临时进入图形...

  • 词语辨析

    continuous,continual,continued continuous: no stopping co...

  • GOCD 基础概念

    核心 CI(Continuous Integration)持续集成,CD(Continuous Delivery)...

  • CI/CD最佳实践

    CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续...

  • 什么是CI/CD?

    CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续...

  • GitLab CI/CD详解

    Continuous Integration(CI)持续集成 Continuous Delivery(CD)持续交...

  • 2020-03-01Feedback

    【20200229 - Sunny Hu Forerunner&ZJU&Dreamtown Joint Meeti...

  • CI持续集成环境搭建-iOS篇

    前言 Continuous integration 持续集成(Continuous integration)是一种...

  • 2018-12-07从0到大论前端持续集成

    持续集成 CI (Continuous integration) 持续交付 CD (Continuous del...

网友评论

      本文标题:ZJU 3768 Continuous Login

      本文链接:https://www.haomeiwen.com/subject/zakltttx.html