首先看懂题目要求,从2021 个 0~9 中组合,问一共能拼到多少?
我们用一个数组来表示0~9 的数字个数,每次用到一个数字都相应的减去-1;直到count=-1;
package com.lanqiao2021;
import java.util.Arrays;
public class BMain {
static int[] arr=new int[10];
public static void main(String[] args) {
Arrays.fill(arr, 2021);
for(int i=1;i<20210;i++) {
if(!isReach(i)) {
System.out.println(i-1);
break;
}
}
}
public static boolean isReach(int num) {
while(num!=0) {
arr[num%10]--;
if(arr[num%10]<0) return false;
num=num/10;
}
return true;
}
}
答案: 3181
C.直线package com.lanqiao2021;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CMain {
static List positions=new ArrayList<>();
public static void main(String[] args) {
//y=k*x+b 确定k,b 则直线就唯一了
for(int x=0;x<=19;x++) {
for(int y=0;y<=20;y++) {
for(int x1=0;x1<19;x1++) {
for(int y1=0;y1<=20;y1++) {
if(x!=x1) {
double k=(double)(y1-y)/(x1-x);
double b=y-k*x;
positions.add(new Position(k,b));
}
}
}
}
}
Collections.sort(positions,(x1,x2)->{
if (x1.k==x2.k) {
return Double.compare(x1.b, x2.b);
}else {
return Double.compare(x1.k, x2.k);
}
});
int count=1;
for(int i=1;i1e-8||
Math.abs(positions.get(i).b-positions.get(i-1).b)>1e-8 ) {
count++;
}
}
count+=20;
System.out.println(count);
}
}
class Position{
double k;
double b;
public Position() {
}
public Position( double k,double b) {
this.k=k;
this.b=b;
}
}
答案:40257
D.货物摆放先找出最简的公约数,通过一个数组封装,然后暴力法找出所有符合条件的选择count++;
package com.lanqiao2021;
import java.util.ArrayList;
import java.util.List;
public class DMain {
public static void main(String[] args) {
List list=new ArrayList<>();
//先找出给定数的最简公约数
long n=2021041820210418L;
for(long i=1;i*i<=n;i++) {
if(n%i==0) {
list.add(i);
if(n/i!=i) {
list.add(n/i);
}
}
}
int count=0;
long size = list.size();
for(int i=0;i
E.路径
数据结构:图(邻接矩阵)
算法:朴素迪克斯算法
①先在未标记的b[]中找出距离原点最近的节点
②在刚加入的A节点的相邻节点找出 dist(A)+g[A][B]
package com.lanqiao2021;
import java.util.Arrays;
public class EMain {
static final int INF = 0x3f3f3f3f;
static final int N = 2030;
static int[][] g = new int[N][N];
static int[] dist = new int[N];
static boolean[] s = new boolean[N];
public static void main(String[] args) {
//初始化图和距离
for(int i = 1; i <= 2021; i++) {
for(int j = i; j <= 2021; j++) {
if(j - i > 21) {
g[i][j] = g[j][i] = INF;
} else {
g[i][j] = g[j][i] = lcm(i, j);
}
}
}
Arrays.fill(dist, INF);
dist[1] = 0;
//朴素DijKstra
for(int i = 1; i <= 2021; i++) {
int v = -1;
for(int j = 1; j <= 2021; j++) {
if(!s[j] && (v == -1 || dist[v] > dist[j])) {
v = j;
}
}
if(v!=-1) {
s[v] = true;
}
for(int j = 1; j <= 2021; j++) {
dist[j] = Math.min(dist[j], dist[v] + g[v][j]);
}
}
System.out.println(dist[2021]);
}
//求最大公约数
public static int gcd(int a, int b) {
//递归方式性能差些,但是写法简单
//return b == 0 ? a : gcd(b, a % b);
int t;
while(b != 0) {
t = a % b;
a = b;
b = t;
}
return a;
}
//求最小公倍数
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
}
答案:10266837
F.时间显示
package com.lanqiao2021;
import java.util.Scanner;
public class FMain {
public static void main(String[] args) {
Scanner scan =new Scanner(System.in);
long currentTime = scan.nextLong();
scan.close();
currentTime%=60*60*24*1000;
currentTime/=1000;
System.out.println(format(currentTime/3600)+":"+format((currentTime/60)%60)+":"+format(currentTime%60));
}
public static String format(long time) {
if(time<10) return "0"+time;
else return ""+time;
}
}
46800999
13:00:00
G. 最少砝码
思路:用平衡三进制法,任何一个数都可以由一个三进制的数组合而来。
package com.lanqiao2021;
import java.util.Scanner;
public class GMain {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n = scanner.nextInt();
int sum=1; int cur=1;
while(sum
H.杨辉三角形
分两步,杨辉三角形的第二列是从0 ,1,2,3,4,5…开始的等差数列,开始从后遍历,直到达到输出范围,没有找到对应的n 的话就说明,在下一行的第2列中 用公式是n*(n+1)/2+2;
否则的话就输出位置。
import java.util.Scanner;
public class 杨辉三角 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long n = scan.nextLong();//输入值,查找
long[] arr =new long[44725];
arr[0]=1;
long k=1L;//k来定义位置
if (n == 1) {
System.out.println(1);
return;
}
for (int i = 1;i<44725; i++) {
for (int j = i; j>=1; j--) {
arr[j] += arr[j - 1];//换行后,进行运算,减少内存
if (arr[j] == n) {
System.out.println(k + i-j + 1);
return;//如果找到了就结束
}
}
k+=(i+1);//每一行有i个值
}
System.out.println(((1 + n) * n / 2) + 2);
}
}



