天天看點

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

位址:​​http://codeforces.com/contest/1345​​

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

    題意:按圖中規則堆金字塔,給出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;
    }
}      

繼續閱讀