卡片+递增三元组——蓝桥杯(JAVA解法)

1、卡片

题目链接:用户登录https://www.lanqiao.cn/problems/2383/learning/?page=5&first_category_id=1&sort=students_count

问题描述

小蓝有 k 种卡片, 一个班有 n 位同学, 小蓝给每位同学发了两张卡片, 一 位同学的两张卡片可能是同一种, 也可能是不同种, 两张卡片没有顺序。没有 两位同学的卡片都是一样的。

给定 n, 请问小蓝的卡片至少有多少种?

输入格式

输入一行包含一个正整数表示 n 。

输出格式

输出一行包含一个整数, 表示答案。

样例输入


6

样例输出


3

样例说明

小朋友们手中的卡片可能是: (1,1),(1,2),(1,3),(2,2),(2,3),(3,3) 。

 代码:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int p =sc.nextInt();
    int n=0;
    for (int i = 1; i < Integer.MAX_VALUE; i++){
        for(int j = 1; j <=i; j++){
           n++;
        if(n>=p){
            System.out.println(i);
            return;
        }  
    } 
  }
}
}

2、递增三元组

题目链接:

用户登录https://www.lanqiao.cn/problems/172/learning/?page=5&first_category_id=1&sort=students_count

题目描述

给定三个整数数组

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​。

其中,1≤N≤105,0≤Ai,Bi,Ci≤105。

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

3
1 1 1
2 2 2
3 3 3

输出

27

 代码:

import java.util.Arrays;
import java.util.Scanner;

// 1:无需package
// 2: 类名必须Main, 不可修改

public class 递增三元组 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n = scan.nextInt();
        int []a = new int[n];
        int []b = new int[n];
        int []c = new int[n];
        for (int i = 0; i <n; i++) {
            a[i]=scan.nextInt();
        }
        for (int i = 0; i <n; i++) {
            b[i]=scan.nextInt();
        }
        for (int i = 0; i <n; i++) {
            c[i]=scan.nextInt();
        }
        long ans=0;
        Arrays.sort(a);
        Arrays.sort(b);
        Arrays.sort(c);
        //没要求列出所有的i,j,k ,不用担心i,j,k排序后顺序乱了,所以可以排序,节约时间
        int p = 0; //a小于b的指针
        int q = 0;//c大于b的指针
        //三个排好序的数组
        //对b从左往又开始扫描,随着b的增大,a小于b的区域(个数),和c小于等于b的区域(个数) 会越来越大,则c大于b的区域(个数)会越来越小
        for (int i = 0; i < n ; i++) {
            while(p<n&&a[p]<b[i])
                p++;
            while(q<n&&c[q]<=b[i])
                q++;
            ans+=((long)p*(n-q));
        }
        System.out.println(ans);

        scan.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值