zoukankan      html  css  js  c++  java
  • D

    D - Pair of Topics

     

     

     思路:

    这个题需要一点思路,ai+aj>bi+bj可以转换成ai-bi+aj-bj>0,也就是c[i]=a[i]-b[i],只需要找c[i]+c[j]大于0

    一开始的想法是枚举i和j,但是很显然会超时

    a和b数组内部的顺序不会影响正确答案个数,所以可以排序

    从两头缩进,如果a[r]加上比较小的a[l]大于0,那么就有l-r种方法,因为比a[l]大的数加上a[r]也会大于0,这样就能保证方法没有遗漏

    当a[l]+a[r]不大于0的时候,说明a[l]太小了,l向右移来找一个更大的a[l]

    代码:

    #include<iostream>
    #include<algorithm>
    #include<string>
    
    using namespace std;
    
    long long a[200005], b[200005], c[200005];
    int main(){
    
        long long n, sum = 0;
        scanf("%lld", &n);
        for (int i = 0; i < n; i++)
            scanf("%lld", &a[i]);
        for (int i = 0; i < n; i++)
            scanf("%lld", &b[i]);
        for (int i = 0; i < n; i++)
            c[i] = a[i] - b[i];
        sort(c, c + n);
        int flag, cnt;
        flag = 0; cnt = n - 1;
        while (1){
            if (flag == cnt)
                break;
            if (c[flag] + c[cnt]>0){
                sum += (cnt-flag);
                cnt--;
            }
            else{
                flag++;
            }
        }
        printf("%lld", sum);
    
        return 0;
    }
  • 相关阅读:
    ubuntu中KDE与GNOME安装切换
    前向算法的数学意义上的实现
    题目1023:EXCEL排序
    题目1022:游船出租
    php notice提示
    Php显示中文时乱码
    题目1021:统计字符
    题目1020:最小长方形
    题目1013:开门人和关门人
    题目1032:ZOJ
  • 原文地址:https://www.cnblogs.com/pcdl/p/12501024.html
Copyright © 2011-2022 走看看