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; }
相关文章推荐
- shell脚本自动修复mysql损坏的表
- 中标麒麟操作系统使用笔记
- 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'
- linux下各种形式的shell加法操作总结
- 【xv6学习之HW1】shell
- shell判断文件夹是否存在
- shell自动删除一个月前的trace文件
- 一个叫vtysh的命令行shell
- shell截取字符串
- UNIX编程(一) C语言实现一个模仿bash的shell实现
- android adb shell remount failed
- shell脚本在执行时,向脚本传递参数
- bash: /usr/bin/php^M: bad interpreter: No such file or directory
- Ubuntu Error:couldn't to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145
- 捣鼓vm里centos能用本地xshell连接
- XShell连接虚拟机Linux
- linux下shell脚本移动、复制文件笔记
- 采用Bash脚本性能监控过程
- shell 中数学计算总结
- shell常用命令和方法总结记录