• 题目:三元组


    题目描述

    已知一个数列a1,a2,a3,a4...an.
    求有多少个逆序三元组。
    逆序三元组:
    d1,d2,d3,
    1.d1>d2>d3
    2.在数组中的下标p1,p2,p3;
    p1>p2>p3;
    (n<=2500 ai<=2^31)

    输入格式

    第一行是n
    第二行是n个数

    输出格式

    多少个逆序三元组。
    (结果小于2^61)

    分析:———————————————————————————————————————————————————

    题意虽较紊乱,但还是可以看懂的,主要是叫我们求一列数中有多少个单调递减的三元组。

    我已开始用的时DFS,但可以确定的是一定会超时,事实是只过了5的点,经tld大牛的提醒,我便学到了这样一个算法。

    令数组a[i]表示当前元素。数组 b[i]表示i之前比a[i]大的数的个数,即把0 to i-1枚举一遍可得。而每个终止于a[i]的三元组对应前面两数比a[i]大的个数,故将所有0<j<j, 只要a[j]>a[i],则j可选,进而以j为中间数的三元组个数为b[j],故总个数为b[j]之和。时间复杂度0(n*n)。

    代码实现:—————————————————————————————————————————————————

    #include<iostream>
    #include<string.h>
    using namespace std;

    int n,a[2501],b[2501];

    int main()
    {
        int i,j,k;long long total=0;
        cin>>n;
        for(i=1;i<=n;i++)
        cin>>a[i];
       
        memset(b,0,sizeof(b));
       
        for(i=1;i<=n;i++)
        for(j=1;j<i;j++)
        if(a[j]>a[i]) b[i]++;
       
        for(i=3;i<=n;i++)
        for(j=2;j<i;j++)
        if(a[i]<a[j]) total+=b[j];
       
        cout<<total;
        system("pause");
        return 0;
       
        }

  • 相关阅读:
    [单链表]链表指针追赶问题
    二叉查找树与平衡二叉树
    二叉树的下一个结点
    fork进程函数总结
    《Effective C++》Item2:尽量以const,enum,inline替换#define
    Hash表的使用
    [数字]整数数字的算法
    算法题:找出整数数组中两个只出现一次的数字
    删除元素的操作
    [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • 原文地址:https://www.cnblogs.com/noip/p/2291297.html
Copyright © 2020-2023  润新知