- 区间k大数查询
java自带的sort超出了我的想象,代码是度来的。因为我自己写了一个快速排序,速度跟不上。我觉得用堆排可能会快一点。但是java自带的方法,太强大了。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int l=input.nextInt();
int[] a=new int[l];
for (int i = 0; i < a.length; i++) {
a[i]=input.nextInt();
}
int n=input.nextInt();
int[][]tag=new int[n][3];
for (int i = 0; i < n; i++) {
tag[i][0]=input.nextInt();
tag[i][1]=input.nextInt();
tag[i][2]=input.nextInt();
}
for (int i = 0; i < n; i++) {
System.out.println(getMaxK(a, tag[i][0], tag[i][1], tag[i][2]));
}
input.close();
}
public static int getMaxK(int[] a,int begin,int end,int k){
int[] aT=new int[end-begin+1];
for (int i =0 ; i < aT.length; i++) {
aT[i]=a[begin-1+i];
}
Arrays.sort(aT);
return aT[aT.length-k];
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
long result1 = n*(n-1)*(n-2);
long result2 = n*(n-1)*(n-3);
long result3 = (n-3)*(n-1)*(n-2);
if(n==1){System.out.println(1);}
else{
if(n==2){System.out.println(2);}
else{
if(n%2 != 0){
System.out.println(result1);
}
else{
if(n%3 != 0){
System.out.println(result2);
}else{
System.out.println(result3);
}
}
}
}
}
}
- K好数
思路:这个数组a是用来存放数量的,这一题不需要写出进制数然后去判断,只需要知道数量就可以了。
我说一个能想通的方向,a[1][i]表示1位k进制数最后一位是i的数量,a[2][i]表示2位k进制数且在最高位是i的数量,然后a[3][i]表示3位k进制数且在最高位是i的数量。最后就像树一样,直到a[l][i],最高位是l,l后面可以跟的数是他的分叉,分叉,分叉。结果就是所有分叉个数的和。
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int k=sc.nextInt();
int l=sc.nextInt();
int [][]a=new int[l+1][k];
for(int j=0;j<k;j++){
a[1][j]=1;
}
for(int i=2;i<=l;i++){
for(int j=0;j<k;j++){
for(int p=0;p<k;p++){
if(p!=(j-1)&&p!=(j+1)){
a[i][j]=(a[i][j]+a[i-1][p])%1000000007;
}
}
}
}
int sum=0;
for(int i=1;i<k;i++){
sum+=a[l][i];
sum%=1000000007;
}
System.out.println(sum);
sc.close();
}
}