1305 Pairwise Sum and Divide

题目来源: HackerRank
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
 收藏
 关注
有这样一段程序,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
李陶冶 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里


这题刚开始傻傻的照着题目copy代码然后交上去超时了,然后经过一番观察,发现此题只和1、2有关,所以我先遍历一遍,有f1个1,f2个2,然后慢慢推导出一个公式 ans=2*(1+2+3+...+(f1-1))+(1+2+...+(f2-1))+n*f1 - f1*f1; 当然,代码中ak是可以在for中执行的,此代码还能优化,我懒。
#include<iostream>
using namespace std;
int f1=0,f2=0;
int ak(int a)
{
    int sum=0;
    for(int i=a-1;i>0;i--)
        sum+=i;
    return sum;
}
int main()
{
    int n,temp,i,sum=0;
    cin>>n;
    for( i=1;i<=n;i++)
    {
        cin>>temp;
        if(temp==1)
            f1++;
        if(temp==2)
            f2++;
    }

    cout<<2*ak(f1)+ak(f2)+n*f1-f1*f1;
    return 0;
}
原文地址:https://www.cnblogs.com/37kiazz73/p/10316880.html