纸牌金字塔
作者:互联网
此题又臭又长,意为:拿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; }
标签:纸牌,扑克牌,int,res,mid,long,while,金字塔 来源: https://www.cnblogs.com/wjk53233/p/16213579.html