Codeforces Round #639 (Div. 2) B. Card Constructions

地址:http://codeforces.com/contest/1345

 

    题意:按图中规则堆金字塔,给出n个材料,尽量往高的堆,问可以堆出多少个金字塔。

      解析:可以推出每个金字塔所需材料数:2,2+5,2+5+8,2+5+8+11.......可以打表,然后二分找>=n的第一个位置,n减去它直到n==0。我当时是把表存在了map里,而且没二分,直接暴力,竟然过了......

#include <bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
const int inf=1e9+10;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        if(n==1)
        {
            cout<<"0"<<endl;continue;
        }
        if(n==2)
        {
            cout<<"1"<<endl;continue;
        }
        map<ll,int>mp;
        ll cnt=2,md=5;
        while(cnt<=n)
        {
            mp[cnt]=1;
            cnt+=md;
            md+=3;
        }
        if(mp[n]==1)
        {
            cout<<"1"<<endl;continue;
        }
        ll k,sum=0,all=n;
        while(all>=2)
        {
            if(mp[n]==1)
            {
                sum++;
                all=all-n;
                n=all;
            }
            else
            {
                n--;
            }
        }
        cout<<sum<<endl;
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12844836.html