hdu 2446(二分查找)

来源:互联网 发布:五线谱翻译成简谱软件 编辑:程序博客网 时间:2024/06/06 11:45

题解:第n个球在第几堆第几行第几个

思路:a[i]保存第i堆个数,b[i]表示前i堆个数,再二分查找对应位置.

#include<stdio.h>#include<string.h>#define MAX 2000000long long a[MAX];long long b[MAX];long long n,x;void Init(){int i;a[1]=1;b[1]=1;for(i=2;i<MAX;i++){a[i]=a[i-1]+i;b[i]=a[i]+b[i-1];}return ;}int main(){int i,j,t;long long s,m,e;Init();scanf("%d",&t);while(t--){scanf("%lld",&n);s=0;e=MAX;m=(s+e)/2;while(1){if(b[m]>=n&&b[m-1]<n)break;if(b[m]>=n){if(m==e)m--;e=m;m=(s+e)/2;}else{if(s==m)m++;s=m;m=(s+e)/2;}}printf("%lld ",m);x=n-b[m-1];s=0;e=m;m=(s+e)/2;while(1){if(a[m]>=x&&a[m-1]<x)break;if(a[m]>=x){if(e==m)m--;e=m;m=(s+e)/2;}else{if(s==m)m++;s=m;m=(s+e)/2;}}printf("%lld %lld\n",m,x-a[m-1]);}return 0;}

0 0
原创粉丝点击