标签:des style color java os io strong 数据
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 80    Accepted Submission(s): 39
 
 
 
5 1 4 2 3 9 0
 
136HintIn the sample, b1=1, c1=4, b2=4, c2=4, b3=4, c3=2, b4=3, c4=9, b5=9, c5=9, so b1 * c1 + b2 * c2 + … + b5 * c5 = 136.
题目中要求计算出第i个数a[i]之前和之后距离i最近的两个a[i]的乘积(如果没有,那就选择a[i]),再把所有的乘积累加起来.
因为给出的是随机数据,所以每个数出现的概率相同,也就是说给出的a[i]大部分都会在几十,几百,或者更高,从前向后遍历,哈希出每个数出现的最近的情况,对于每一个要判断的数,从0倍开始不断增加,一直到maxn,统计所有出现过的倍数,和位置最接近那个数的点,如果没有,就记录自身,得到所有数的前面的倍数是那个,同样的方法得到后面的倍数,相乘累加。
如果a[i]是1,那么不节约时间,a[i]是10,最多用10000/10 ,a[i]是100 用时10000/100,
#include <cstring>
#include <cstdio>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL __int64
struct node
{
    LL num, f;
}_hash[110000];
LL a[110000], b[110000], c[110000];
int main()
{
    LL n, i, j, sum, max1, mmax;
    LL ans;
    while(scanf("%I64d",&n)!=EOF&&n)
    {
        max1=-1;
        for(i=1;i<=n;i++)
        {
            scanf("%I64d",&a[i]);
            if(max1<a[i])
                max1=a[i];
        }
        for(i=1;i<=max1;i++)
            _hash[i].f=0;
        for(i=1;i<=n;i++)
        {
            mmax=-1;
            for(j=a[i];j<=max1;j+=a[i])
            {
                if(_hash[j].f)
                {
                    if(mmax<_hash[j].num)
                    {
                        mmax=_hash[j].num;
                    }
                }
            }
            _hash[a[i]].f=1;
            _hash[a[i]].num=i;
            if(mmax==-1)
                b[i]=a[i];
            else
                b[i]=a[mmax];
        }
        for(i=1;i<=max1;i++)
            _hash[i].f=0;
        for(i=n;i>=1;i--)
        {
            mmax=1e7;;
            for(j=a[i];j<=max1;j+=a[i])
            {
                if(_hash[j].f)
                {
                    if(mmax>_hash[j].num)
                    {
                        mmax=_hash[j].num;
                    }
                }
            }
            _hash[a[i]].f=1;
            _hash[a[i]].num=i;
            if(mmax==1e7)
                c[i]=a[i];
            else
                c[i]=a[mmax];
        }
        ans=0;
        for(i=1;i<=n;i++)
        {
            ans+=b[i]*c[i];
            //printf("b==%d  c==%d\n",b[i],c[i]);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
 
2014多校1002--hdu4961--Boring Sum,布布扣,bubuko.com
2014多校1002--hdu4961--Boring Sum
标签:des style color java os io strong 数据
原文地址:http://blog.csdn.net/winddreams/article/details/38686223