1、卡片
题目链接:
问题描述
小蓝有 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、递增三元组
题目链接:
题目描述
给定三个整数数组
A=[A1,A2,⋯AN],
B=[B1,B2,⋯BN],
C=[C1,C2,⋯CN],
请你统计有多少个三元组(i,j,k) 满足:
- 1≤i,j,k≤N;
- 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(); } }