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

 

Codeforces Round #639 (Div. 2) B. Card Constructions_打表

 

Codeforces Round #639 (Div. 2) B. Card Constructions_c++_02

    题意:按图中规则堆金字塔,给出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;
}
}