zoukankan      html  css  js  c++  java
  • 蓝桥杯-递增三元组

    给定三个整数数组
    A = [A1, A2, ... AN], 
    B = [B1, B2, ... BN], 
    C = [C1, C2, ... CN],
    请你统计有多少个三元组(i, j, k) 满足:
    1. 1 <= i, j, k <= N 
    2. Ai < Bj < Ck
    
    【输入格式】 
    第一行包含一个整数N。
    第二行包含N个整数A1, A2, ... AN。
    第三行包含N个整数B1, B2, ... BN。
    第四行包含N个整数C1, C2, ... CN。
    
    对于30%的数据,1 <= N <= 100 
    对于60%的数据,1 <= N <= 1000 
    对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000
    
    【输出格式】
    一个整数表示答案
    
    【样例输入】
    3
    1 1 1
    2 2 2
    3 3 3
    
    【样例输出】
    27

    常规解题思路:可以先对三个数组排序,然后遍历数组b,查找a数组中有多少个小于b[i]的,c数组中有多少个大于b[i]的

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAXN = 100005;
    int a[MAXN],b[MAXN],c[MAXN];
    int n,sum;
     
    int main()
    {
      scanf("%d",&n);
      for(int i=0;i<n;i++)scanf("%d",&a[i]);
      for(int i=0;i<n;i++)scanf("%d",&b[i]);
      for(int i=0;i<n;i++)scanf("%d",&c[i]);
      sort(a,a+n);
      sort(b,b+n);
      sort(c,c+n);
      
      sum = 0;
      for(int i = 0 ;i < n; i++){
        int x = (lower_bound(a,a+n,b[i]) - a);
        int y = (n - (upper_bound(c,c+n,b[i]) - c));//这里的这两个函数那位博主用的很好
        sum += x*y;
      }
      printf("%d
    ",sum);
      
      return 0;
    }
  • 相关阅读:
    Java代码的执行顺序一
    面试套路-技术需求
    常用数据库的分页实现
    真假分页优缺点
    获取一些系统和用户的通用属性
    反射的使用
    sql复制表数据的方法
    跨服务器的sql使用
    sql 随机数
    常用正则
  • 原文地址:https://www.cnblogs.com/wizarderror/p/10572867.html
Copyright © 2011-2022 走看看