HDU 2446 Shell Pyramid 二分查找

原创 2012年03月21日 09:33:47

今天上午终于把最后一题D题水掉了。我的二分也算是AK了了吧。
这题可以说我还是有版权的,嘿嘿~~越来越有意思了!
说一下怎么做吧。
听说有公式就试着自己推了一下,感觉不错呢。
首先我们可以看出

a1=1,a2=3,a3=6. 很显而易见的an=(1+n)*n/2;
那么Sn怎么求呢???Sn=∑an=(1/2)∑(n*n+n)=0.5*(∑n*n+∑n);
这样就转化为连续自然数平方的和与连续自然数的和了。
连续自然数和:(1+n)*n/2
平方的和公式:n(n+1)(2n+1)/2
立方的和公式:[n(n+1)/2]^2
将公式带入最终化简------>Sn=n(n+1)(n+2)/6; 很漂亮的一个公式诞生了

偷笑

接下来用二分来搜索答案就好了。
觉得自己的代码还是很美观的~虽然还有漏洞

#include<iostream>
#define MAXLayer 1111111
using namespace std;

__int64 layerSum[MAXLayer];

__int64 getSum( __int64 m )
{
 		__int64 sum;
 		sum=m*(m+1)/2;
	 	   if( sum%3==0 ){
   			   sum/=3;sum*=(m+2);
    	   }
    	   else sum*=(m+2)/3;
    	return sum;
}

int BinarySeachLayer( __int64 &num )
{
 	__int64 l=1,r=3810776,m;
 	__int64 sum;
 	while( m=(l+r)/2,l<r )
 	{
	 	   sum=getSum(m);
	 	   if( sum>=num ) r=m;
	 	   else l=m+1;
  	}
  	num-=getSum(m-1);
  	return (int)m;
}

int BinarySeachRow( __int64 &num )
{
 	__int64 l=1,r=3810776,m;
 	__int64 sum;
 	while( m=(l+r)/2,l<r )
 	{
	 	   sum=(1+m)*m/2;
	 	   if( sum>=num ) r=m;
	 	   else l=m+1;
  	}
  	num-=(m-1)*m/2;
  	return (int)m;
}
int main()
{
 	__int64 N;int T;
 	scanf( "%d",&T );
 	while( T-- )
 	{		
		   scanf("%I64d",&N);
	 	   int Layer=BinarySeachLayer( N );
	 	   int Row=BinarySeachRow( N );
	 	   int Column=N;
	 	   printf( "%d %d %d\n",Layer,Row,Column );
  	}
  	return 0;
}


版权声明:本文为博主原创文章,转载请写明出处。

相关文章推荐

HDU 2446 Shell Pyramid(二分查找 数学)

HDU 2446 Shell Pyramid(二分查找 数学)

HDU/HDOJ 2446 Shell Pyramid 2008 Asia Regional Harbin

Shell Pyramid Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

hdu 5432 Pyramid Split【二分查找】

Pyramid Split Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

一维数组 冒泡排序 shell 排序 二分查找 C++

首先是两种排序的算法:冒泡排序与希尔(shell)排序 冒泡排序的平均时间复杂度是O(n^2),最好的时间复杂度为O(n),空间复杂度是1; 希尔排序的时间复杂度是O(nlogn),空间复杂度也是1;...

HDU 5432 Pyramid Split 二分

小明是城会玩,他有很多底面是正方形的黄金锥体,我们称之为金字塔,它由高度和底面正方形边长可以确定,分别称之为金字塔的高和宽。 为了便于理解,单位统一取米。现在小明有nn个金字塔,已知它们的高和宽,小...

hdu5432 Pyramid Split(二分)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5432 题目大意: 给一些底面为正方形的锥体,现在要给这些锥体来一刀,即给一个平面,使得这些...

二分查找 hdu 4004

The Frog's Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) ...

hdu4768Flyer(二分查找)

题目链接:点击打开链接 题意描述:给定一些线段,线段的斜率为Ci,y取值范围为[Ai,Bi],现在每个线段都会覆盖一些整数y,其中有一个整数y被覆盖了奇数次,找出它? 解题思路: 由于B...

hdu1839 spfa+二分查找

这个题~~~~当时没做出,看了别人才慢慢理解的; 题意讲的是给定一个时间 求从1到n点花费的在那个给定时间内c最小的值。 输入输出:t组数据                    第二行是 n个...

HDU1025 - Constructing Roads In JGShining's Kingdom - 动态规划+二分查找

1.题目描述: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Me...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 2446 Shell Pyramid 二分查找
举报原因:
原因补充:

(最多只允许输入30个字)