其他分享
首页 > 其他分享> > 纸牌金字塔

纸牌金字塔

作者:互联网

 

 此题又臭又长,意为:拿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