51nod1305

来源:互联网 发布:debian 软件源配置 编辑:程序博客网 时间:2024/05/30 04:32
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示例
31 4 1
Output示例
4
李陶冶 (题目提供者)
C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里

题目分析:这个题目首先看数据肯定是不能用暴力去解决的,因为肯定会超时。这个题目关键在于发现所定义的公式其实是为两个数的倒数相加之和向下取整的值,所以很容易知道只有当其中大的倒数大于等于1/2时和取整才会大于0,否则为0。知道这个就好办了,先把这些数从小到大排序,当其中较小的数大于2时,直接跳出循环,因为后面的两个数的倒数之和肯定会等于0。

代码:
#include <iostream>#include <algorithm>using namespace std;#define size 100010int main(){    int n,a[size];    long long sum=0;    cin>>n;    for(int i=1;i<=n;i++){        cin>>a[i];    }    sort(a+1,a+n+1);    for(int i=1;i<=n;i++){        for(int j=i+1;j<=n;j++){            if(a[i]<3){                sum+=int(1.0/a[i]+1.0/a[j]);            }            else{                break;            }        }    }    cout<<sum<<endl;    return 0;}


0 0
原创粉丝点击