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; } }