hdu2446--二分搜索+打表

来源:互联网 发布:淘宝高仿鞋哪些店铺 编辑:程序博客网 时间:2024/06/05 08:45

题意大概就是:拿一堆炮弹,堆三角形,问最后一个炮弹,在第几个三角形的第几行的第几个。
数据量是小于2的63次方,我没找数学规律,用的打表做的。

大概想法就是,打一个 第i个三角形由几个炮弹组成的表(第i个=第i-1个+i),再打一个第i个三角形之前(包括第i个)一共有多少个炮弹。 然后先二分找炮弹在第几个三角形,再二分找在第几行。 最后算得最后位置。

#include <iostream>#include <cstdio>#define M 1000001using namespace std;long long int num[M], sum[M];void dabiao(){    num[0] = sum[0] = 0;    for(int i=1; i<M; i++)    {        num[i] = num[i-1] + i;        sum[i] = num[i] + sum[i-1];    }}int twosearch1(long long int n){    int left = 0, right = M-1, middle;    while(left + 1 != right) //这样找到   sum[left] < n <=sum[right]    {        middle = left + (right - left) / 2; //防止溢出        if(sum[middle] < n)        {            left = middle;        }        else        {            right = middle;        }    }    return right;}int twosearch2(int right, long long int n){    int left = 0, middle;    while(left + 1 != right)    {        middle = left + (right -left) / 2;        if(num[middle] < n)        {            left = middle;        }        else        {            right = middle;        }    }    return right;}int main(){    int t;    scanf("%d",&t);    dabiao();    while(t--)    {        long long int n;        int ans1,ans2,ans3;        scanf("%I64d",&n);        ans1 = twosearch1(n);        ans2 = twosearch2(ans1,n-sum[ans1-1]);        ans3 = n - sum[ans1-1] - num[ans2-1];        printf("%d %d %d\n",ans1,ans2,ans3);    }    return 0;}
原创粉丝点击