1305 Pairwise Sum and Divide(数学 ,规律)

Posted Veritas des Liberty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1305 Pairwise Sum and Divide(数学 ,规律)相关的知识,希望对你有一定的参考价值。

技术分享
HackerRank
 
有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:
 
fun(A)
    sum = 0
    for i = 1 to A.length
        for j = i+1 to A.length
            sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) 
    return sum
 
给出数组A,由你来计算fun(A)的结果。例如:A = {1, 4, 1},fun(A) = [5/4] + [2/1] + [5/4] = 1 + 2 + 1 = 4。
Input
第1行:1个数N,表示数组A的长度(1 <= N <= 100000)。
第2 - N + 1行:每行1个数A[i](1 <= A[i] <= 10^9)。
Output
输出fun(A)的计算结果。
Input示例
3
1 4 1
Output示例
4
 
看似简单的水题,但是里面的数学规律真的很难找,暴力的话超时,看了大神的代码后感觉一脸懵逼。欲辨已忘言。
这题真心坑,(a[i]+a[j])/(a[i]*a[j])只有当a[i]或a[j]为1或者为2是该式才不为零,其余情况都为0;
 
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
C++ 技术分享
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    int a[100005];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
            sort(a+1,a+1+n);
            int c1=0,c2=0,c3=0;
            for(int i=1;i<=n;i++)
            {
                if(a[i]==1)
                 c1++;
                 else if(a[i]==2)
                        c2++;
                 else c3++;
            }
            int ans=c1*(c1+c2+c3-1)+c2*(c2-1)/2;
            printf("%d\n",ans);
    }
    return 0;
}
 
 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
运行代码
提交代码

以上是关于1305 Pairwise Sum and Divide(数学 ,规律)的主要内容,如果未能解决你的问题,请参考以下文章

1305 Pairwise Sum and Divide(数学 ,规律)

1305 Pairwise Sum and Divide

51nod 1305 Pairwise Sum and Divide(数学分析题)

1305 Pairwise Sum and Divide

[51nod] 1305 Pairwise Sum and Divide 数学

51Nod 1305 Pairwise Sum and Divide | 思维 数学