zoukankan      html  css  js  c++  java
  • 【Codeforces Round #639 (Div. 2) B】Card Constructions

    题目链接

    点我呀

    翻译

    给你 (n) 张卡, 问你最多能叠成多少个金字塔卡组。

    题解

    找找规律会发现。

    高度为 (h) 的三角形, 一共有 (0+1+2+...+h-1) 个横着放的卡。

    然后一共有 (2 imes (1+2+3+...+h)) 个竖着放的卡。

    所以高度为 (h) 的三角形一共有 $ frac{ (0 + h-1) imes h}{2} + 2 imes frac{ (1+h) imes h}{2}$ 张卡片

    能在 (mathcal{O}(sqrt{n})) 的时间复杂度下算出来 (1) ~ (maxh) 高度的三角形需要多少张卡片, 其中 (maxh)

    (10^9) 规模的 (n) 能够堆成的最高高度的三角形。

    预处理出来之后, 每个询问从大到小把所有高度的三角形试一下能不能用 (n) 张卡片堆出来, 能堆出来就

    减去就行 (别真一个一个减啊, 直接用除法和取模表示扣掉卡片)

    代码

    #include<bits/stdc++.h>
    #define ll long long
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%I64d",&x)
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    using namespace std;
    
    const int N = 26e3;
    const int MOD = 998244353;
    
    int n,m;
    int a[N+10];
    
    int main(){
        #ifdef LOCAL_DEFINE
            freopen("D:\rush.txt","r",stdin);
        #endif
        ios::sync_with_stdio(0),cin.tie(0);
        //an = 2*n + 3*n*(n-1)/2
        rep1(i, 1, N){
            a[i] = 2 * i + 3 * i * (i - 1) / 2;
        }
        int T;
        for (cin >> T;T > 0;T--){
            cin >> n;
            int cnt = 0;
            rep2(i, N, 1){
                cnt += n / a[i];
                n = n % a[i];
            }
            cout << cnt << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    linux系统scp和rsync同步命令介绍
    linux系统发现系统变慢
    linux系统centos6和centos7开机流程及定时任务语法
    elasticsearch for windows
    elasticsearch for linux
    Python操作elasticsearch
    elasticsearch之快速上手
    elasticsearch简介
    flask中使用celery
    GoJS
  • 原文地址:https://www.cnblogs.com/AWCXV/p/13173311.html
Copyright © 2011-2022 走看看