• 51nod 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

    floor(a+b)!=floor(a)+floor(b),所以不能将上式展开考虑。
    经整体观察,会发现使得floor((a[i]+a[j])/(a[i]*a[j])!=0的情况只有三种:
    (1)a[i]=1&&a[j]=1,结果累加2
    (2)其中一个为1,另一个不为1,结果累加1
    (3)a[i]=2&&a[j]=2,结果累加1

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 typedef long long ll;
     7 ll a[100005];
     8 int main()
     9 {
    10     ll n;
    11     scanf("%lld",&n);
    12     for(int i=1;i<=n;i++)
    13         scanf("%lld",&a[i]);
    14     sort(a+1,a+1+n);
    15     ll k=1;
    16     while(a[k]==1)//1的数量
    17         k++;
    18     k--;
    19     ll j=k+1;
    20     while(a[j]==2)//2的数量
    21         j++;
    22     ll sum=j-1-(k+1)+1;
    23     cout<<k*(k-1)+k*(n-k)+sum*(sum-1)/2<<endl;
    24 
    25     return 0;
    26 }
    View Code
     
  • 相关阅读:
    Autofac(01)
    深入理解ADO.NET Entity Framework(02)
    使用excel 数据透视表画图
    C# 控制CH341进行SPI,I2C读写
    C# winform使用combobox遍历文件夹内所有文件
    通用分页存储过程
    如何让你的SQL运行得更快
    sql优化之使用索引
    SQL优化
    SQL 循环语句几种写法
  • 原文地址:https://www.cnblogs.com/onlyli/p/7258321.html
Copyright © 2020-2023  润新知