位址: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;
}
}