您的位置:首页 > 运维架构 > Shell

HDU 2446 Shell Pyramid

2015-10-24 00:04 621 查看
分析:题意就是给你一个正4面体的金字塔,从顶往底数,第1层有c[1]=1个球,第2层有c[2]=3个球.....第i层有c[i]=c[i-1]+i个球,第i层有i行,第j行有j个球,现按层从顶往底,按行从上往下,按列从左往右,依次对每个球进行编号1,2,3,4....... 问你序号为n的球在第几层,第几行,第几列。用数组c[i]来表示第i层有c[i]个球,s[i]表示第i层最大的球的序号,那么s[i]=s[i-1]+c[i],即c[i]=s[i]-s[i-1],然后二分查找球是在哪一层,然后把序号减去所在层的前一层的球的最大序数就能算出这个球在这层是第几个,然后再二分查找是第几行的,知道第几行的话,第几列也就出来了。

# include <stdio.h>
# define N 3810777
__int64 s[N+5];
int Search1(__int64 n)
{
int l=1,r=N,mid;
if(n>s
)
return N;
while(l<r)
{
mid=(l+r)/2;
if(n>s[mid])
l=mid+1;
else
r=mid;
}
return l;
}
int Search2(__int64 n)
{
int l=1,r=N,mid;
if(n>s
-s[N-1])
return N;
while(l<r)
{
mid=(l+r)/2;
if(n>s[mid]-s[mid-1])
l=mid+1;
else
r=mid;
}
return l;
}
int main()
{
int i;
__int64 t,n,ans,c=1;
s[1]=1;
for(i=2;i<=N;i++)
c+=i,s[i]=s[i-1]+c;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
ans=Search1(n);
printf("%d ",ans);
n-=s[ans-1];
ans=Search2(n);
printf("%d ",ans);
n-=s[ans-1]-s[ans-2];
printf("%d\n",n);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: