文章目录
A. 星期计算
思路解析:
答案:
代码:
package lanqiao;
import java.math.BigInteger;
//答案:6+1=7
public class A_星期计算 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger num = new BigInteger("20");
BigInteger ans = new BigInteger("1");
for(int i=1;i<=22;i++) {
ans = ans.multiply(num);
}
System.out.println(ans);
System.out.println(ans.mod(new BigInteger("7")));
}
}
B. 山
思路解析:
答案:
代码:
package lanqiao;
public class B_山 {
//答案:3138
public static void main(String[] args) {
// TODO Auto-generated method stub
long ans=0;
for(long i=2022;i<=2022222022;i++) {
if(check(i)) {
ans++;
}
}
System.out.println(ans);
}
private static boolean check(long i) {
//判断是否回文
String string = String.valueOf(i);
StringBuilder sBuilder = new StringBuilder(string);
if(string.compareTo(sBuilder.reverse().toString())==0) { //是回文数
for(int j=0;j<string.length()/2;j++) {
int pre = Integer.valueOf(string.charAt(j));
int aft = Integer.valueOf(string.charAt(j+1));
if(aft<pre)
return false;
}
System.out.println(i);
return true;
}
return false;
}
}
C. 字符统计
思路解析:
代码:
/**
*
*/
package lanqiao;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class C_字符统计 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String string = scanner.next();
Map<Character, Integer> map = new HashMap<>();
int ans_count = Integer.MIN_VALUE;
for(int i=0;i<string.length();i++) {
char c = string.charAt(i);
if(map.get(c)==null) {
map.put(c, 1);
}else {
map.put(c, map.get(c)+1);
}
if(map.get(c)>ans_count) {
ans_count=map.get(c);
}
}
Set<Character> ansCharacters = new TreeSet<>();
for(Map.Entry<Character, Integer> entry:map.entrySet()) {
if(entry.getValue()==ans_count) {
ansCharacters.add(entry.getKey());
}
}
for(Character c:ansCharacters) {
System.out.print(c);
}
}
}
D. 最少刷题数
思路解析:
代码:
package lanqiao;
import java.util.Arrays;
import java.util.Scanner;
public class D_最少刷题数 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int[] arr = new int[N];
int[] find = new int[N];
for(int i=0;i<N;i++) {
int num = scanner.nextInt();
arr[i]=num;
find[i]=num;
}
Arrays.sort(find);
for(int i=0;i<N;i++) {
//在find中查找arr[i]的位置
int pos = Arrays.binarySearch(find, arr[i]);
//计算其左边的数
int less = pos;
int more = N-pos-1;
if(more>less) { //刷题多的多余刷题少的
int d = more-less;
int num = find[pos+d/2]-find[pos]+1;
System.out.print(num+" ");
}else {
System.out.print(0+" ");
}
}
}
}
E. 求阶乘
思路解析:
代码:
package lanqiao;
import java.util.Scanner;
public class E_求阶乘 {
static int[] rec;
//一个2与一个5可以产生一个0;在N的阶乘中,2的数目肯定多余5的数目,所以考虑5的数目就可以
public static void main(String[] args) {
rec=new int[100000000];
Scanner scanner=new Scanner(System.in);
long k=scanner.nextLong();
int num=5;
rec[5]=1;
while(k>0) {
int count = f(num); //计算num中含有多少个5
k-=count;
if(k<=0)break;
num+=5;
}
if(k<0) {
System.out.println(-1);
}else {
System.out.println(num);
}
}
private static int f(int num) {
if(rec[num]!=0||num<5) {
return rec[num];
}
if(num%5==0) {
int res = 1+f(num/5);
rec[num]=res;
return res;
}else {
rec[num]=0;
return 0;
}
}
}
F. 最大子矩阵
思路解析:
代码:
package lanqiao;
import java.util.Scanner;
public class F_最大子矩阵 {
static int[][] arr;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int M=scanner.nextInt();
arr=new int[N][M];
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
arr[i][j]=scanner.nextInt();
}
}
int limit = scanner.nextInt();
int max_are = Integer.MIN_VALUE;
for(int i=N;i>0;i--) {
for(int j=M;j>0;j--) { // i*j的矩阵
for(int x=0;x<=N-i;x++) {
for(int y=0;y<=M-j;y++) { //左上角坐标
int max = find_max(i,j,x,y);
int min = find_min(i,j,x,y);
if((max-min)<=limit) {
max_are = Math.max(max_are, i*j);
// System.out.println(x+" "+y+" "+" "+i+" "+j);
// System.out.println(i*j);
// return;
}
}
}
}
}
System.out.println(max_are);
}
private static int find_min(int i, int j, int x, int y) {
// TODO //寻找最小值
int res = Integer.MAX_VALUE;
for(int n=x;n<x+i;n++) {
for(int m=y;m<y+j;m++) {
res = Math.min(res, arr[n][m]);
}
}
return res;
}
private static int find_max(int i, int j, int x, int y) {
// TODO 寻找最大值
int res = Integer.MIN_VALUE;
for(int n=x;n<x+i;n++) {
for(int m=y;m<y+j;m++) {
res = Math.max(res, arr[n][m]);
}
}
return res;
}
}
G. 数组切分
思路解析:
代码:
/**
*
*/
package lanqiao;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class G_数组切分 {
static boolean[] vis;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] arr = new int[N];
vis = new boolean[N];
for (int i = 0; i < N; i++) {
arr[i] = scanner.nextInt();
}
long ans = DFS(arr, 0);
System.out.println(ans);
}
private static long DFS(int[] arr, int k) {
if (k == arr.length-1) {
if (check(arr)) {
// for(int i=0;i<vis.length;i++) {
// System.out.print(vis[i] + " ");
// }
// System.out.println();
return 1;
}
return 0;
}
// 当前位置切
int res = 0;
vis[k] = true;
res += DFS(arr, k + 1);
// 当前位置不切
vis[k] = false;
res += DFS(arr, k + 1);
return res;
}
private static boolean check(int[] arr) {
// TODO 检查当前切法是否符合规则
int len = arr.length;
int p = 0;
int q = 1;
while (q < len) {
if (vis[q - 1]) {
if (!check_lianxu(arr, p, q)) {
return false;
}
p=q;
}
q++;
}
if(!check_lianxu(arr, p, q)) {
return false;
}
return true;
}
private static boolean check_lianxu(int[] arr, int p, int q) {
// TODO 检测数组是否连续p-q
int[] arrcopy = new int[q-p];
System.arraycopy(arr, p, arrcopy, 0, q-p);
Arrays.sort(arrcopy);
for(int i=0;i<q-p-1;i++) {
if(arrcopy[i+1]-arrcopy[i]!=1) {
return false;
}
}
return true;
}
}
H. 回忆迷宫
时间能力有限,今年难度明显增加,实在没时间去做
I. 红绿灯
时间能力有限,今年难度明显增加,实在没时间去做
J. 拉箱子
时间能力有限,今年难度明显增加,实在没时间去做