• 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 ",ans);
        }
        return 0;
    }
     
     
     
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    运行代码
    提交代码
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    powermock测试
    一些疑惑
    Java基础总结3
    Java学习路线
    Java基础总结2
    关于我
    翻转单词序列
    和为s的两个数字
    和为s的连续正数序列
    数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7470229.html
Copyright © 2020-2023  润新知