A:ASC
public static void main(String[] args) {
System.out.println('L'+0);
}
B:卡片
自己解析:
-----------------------------------------------------------------------------
public static void main(String[] args) {
int arr[]=new int[2021];
int m=0;
list: for(int i=1;i<30000;i++) {
int n=i;
while(n>0) {
arr[n%10]++;
if(arr[n%10]==2022) {
m=i-1;
break list;
}
n/=10;
}
}System.out.println(m);
}
C:直线(数学)
D:货物摆放(dfs)
static Listdiv = new ArrayList<>(); static int ans = 0; static long num = 2021041820210418L; static long[] dfs=new long[100]; public static void main(String[] args) { long end = (long)Math.sqrt(num); for (long i = 1; i <= end; i++) { //去重`.` if (num % i == 0&&!div.contains(num/i)&&!div.contains(i)) { div.add(num / i); div.add(i); } } dfs(0); System.out.println(ans); } public static void dfs(int n) { if(n==3) { if(dfs[0]*dfs[1]*dfs[2]==num) { ans++; } return; } for(int i=0;i
---------------------------------------------------------------------
static int ans=0;
static long num=2021041820210418L;
public static void main(String[] args) {
long end=(long)Math.sqrt(num);
Setdiv=new HashSet<>();
for(long i=1;i<=end;i++)
{
if(num%i==0) {
div.add(num/i);
div.add(i);
}
}
Long [] arr=div.toArray(new Long[0]);
for(long i:arr) {
for(long j:arr) {
for(long k:arr) {
if(i*j*k==num) {
ans++;
}
}
}
}
System.out.println(ans);
}}
E:路径(DP)
Dijkstra
static class Edge {
int to, length;
Edge(int _to, int _length) {
to = _to;
length = _length;
}
}
static List[] graph;
static final int INF = 0x3f3f3f3f;
private static int dijkstra(int st, int ed) {
// 新建小根堆
PriorityQueue pq = new PriorityQueue<>((a, b) ->
Integer.compare(a.length, b.length));
boolean[] vis = new boolean[2050];
int[] dist = new int[2050];
Arrays.fill(dist, INF);
dist[st] = 0;
// to 为点的编号,length 为当前路径长度
pq.offer(new Edge(st, dist[st]));
while (!pq.isEmpty()) {
int from = pq.poll().to;
if (vis[from]) {
continue;
}
vis[from] = true;
// 松弛操作
for (Edge next : graph[from]) {
int to = next.to, len = next.length;
if (dist[to] > dist[from] + len) {
dist[to] = dist[from] + len;
pq.offer(new Edge(to, dist[to]));
}
}
}
return dist[ed];
}
private static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
public static void main(String[] args) {
graph = new List[2050];
// 构建邻接表
for (int i = 1; i <= 2021; i++) {
int st = Math.max(i - 21, 1);
for (int j = st; j <= i; j++) {
int div = gcd(j, i);
int lcm = i * j / div;
if (graph[i] == null) {
graph[i] = new ArrayList<>();
}
if (graph[j] == null) {
graph[j] = new ArrayList<>();
}
graph[i].add(new Edge(j, lcm));
graph[j].add(new Edge(i, lcm));
}
}
System.out.println(dijkstra(1, 2021)); // 10266837
}
F:时间显示(时间)
-------------------------------------------------------------------------------------------------
Scanner s=new Scanner(System.in);
long ss=s.nextLong();
Date date=null;
SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss");
Calendar calendar=Calendar.getInstance();
calendar.set(0, 0, 0, 0, 0, 0);
calendar.add(Calendar.SECOND, (int) (ss/1000));
date= calendar.getTime();
System.out.println(df.format(date));
}
-------------------------------------------------------------------------------------------
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
long time=sc.nextLong();
long n=8*60*60*1000;
date.setTime(time-n);
String s= sdf.format(date);
System.out.println(s);
}
G:最少砝码(三进制)
-------------------------------------------------------------------
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int weight = 1;
int count = 1;
int total = 1;
while (total < n) {
count++;
weight *= 3;
total += weight;
}
System.out.println(count);
}
-------------------------------------------------------------
H:杨辉三角形
---------------------------------------------------------------------------------------------------------------
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int weight = 1;
int count = 1;
int total = 1;
while (total < n) {
count++;
weight *= 3;
total += weight;
}
System.out.println(count);
}
---------------------------------------------------------------------------------------------------------------
static int N;
public static void main(String[] args) {
N = new Scanner(System.in).nextInt();
if (N == 1) System.out.println(1);
else {
long ans = (N + 1L) * N / 2 + 2;
for (int m = 2; m < 16; m++) {
int start = m * 2, end = N;
while (start <= end) {
int mid = start + end >> 1;
if (C(mid, m) == N) {
ans = min(ans, (mid + 1L) * mid / 2 + m + 1);
break;
} if (C(mid, m) > N) end = mid - 1;
else start = mid + 1;
}
}
System.out.println(ans);
}
}
static long min(long a, long b) { return a < b ? a : b; }
static long C(int n, int m) {
long num = 1;
for (int nm = 1; nm <= m; n--, nm++)
if ((num = num * n / nm) > N) return num;
return num;
}
I:双向排序
------------------------------------------------------------------------------------
static int N = 100010;
static pair[] stk = new pair[N];
static int[] ans = new int[N];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int top = 0;
int p, q;
for (int i = 0; i < m; i++) {
p = scanner.nextInt();
q = scanner.nextInt();
if (p == 0) {
while (top != 0 && stk[top].x == 0)
q = Math.max(q, stk[top--].y);
while (top >= 2 && stk[top - 1].y <= q)
top -= 2;
stk[++top] = new pair(0, q);
} else if (top != 0) {
while (top != 0 && stk[top].x == 1)
q = Math.min(q, stk[top--].y);
while (top >= 2 && stk[top - 1].y >= q)
top -= 2;
stk[++top] = new pair(1, q);
}
}
int k = n, l = 1, r = n;
for (int i = 1; i <= top; i++) {
if (stk[i].x == 0) {
while (r > stk[i].y && l <= r) ans[r--] = k--;
} else {
while (l < stk[i].y && l <= r) ans[l++] = k--;
}
if (l > r) break;
}
if (top % 2 == 1) {
while (l <= r) ans[l++] = k--;
} else {
while (l <= r) ans[r--] = k--;
}
for (int i = 1; i <= n; i++) {
System.out.printf("%d ", ans[i]);
}
}
static class pair {
int x, y;
pair(int x, int y) {
this.x = x;
this.y = y;
}
}



