纸牌金字塔

此题又臭又长,意为:拿n个扑克牌搭个最大三角形以此类推,问能搭多少个?
这题为难亿点的二分
主要是高度二分,用目前扑克牌数当右边界,1当左边界。这里有个细节,r=扑克牌数,l=1,因为为了保证有答案所以这么写。然后就是模板了。
int l = -1,r =N; while(l+1!=r) { m=(l+r)>>1; if(check(m)) l=m; else r=m; } return l or r;
难点:计算高为h的扑克牌三角形需有多少扑克牌,
其实就分竖着的:
和横着的:
只要把他们俩加起来就行了。( (1+h)*h+h*(h-1)/2 )
以上就是本题的难点。剩下亿些小细节就可以自行处理了。
程序:
#include<bits/stdc++.h> using namespace std; const int N=1e6; long long t; long long num(long long h) { return (1+h)*h+h*(h-1)/2; } int main() { cin>>t; while(t--) { long long s; scanf("%d",&s); long cnt=0; long long r=s+1,l=0; while(s>=2) { cnt++; long long le=1,ri=s; long long res=2; while(le<=ri) { long long mid=(le+ri)/2; if(num(mid)>s) { ri=mid-1; } else { res=max(res,num(mid)); le=mid+1; } } s-=res; } printf("%d\n",cnt); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通