目录
一、距离和
原题链接
解析:
这题的话直接搜索就可以了,按照顺序,每一个都和在它后面的数进行比较:
l----a;l---n;l----q;l---i;l----a;l-----o;
a---n;a---q;a----i;a----a;a----o;
具体代码如下:
代码:
public class 距离和 {
public static void main(String[] args) {
int []arr={'L','A','N','Q','I','A','O'};
int count=0;
for (int i=0;i<arr.length-1;i++){
for (int j=i+1;j<arr.length;j++){
count+=Math.abs(arr[i]-arr[j]);
}
}
System.out.println(count);
}
}
二、扩散
原题链接
解析:
这题就是一个简单的bfs题,当然存在着几个坑点:
坑点1:起始4个位置为黑色;
坑点2:可以存在负数坐标;
我们已知每分钟只会向边上扩散一格,那么2020分钟就是2020格,所以在做这题的时候,我们只要让每一个起始位置+2020就可以,当然为了防错,每一个值+3000,然后套用bfs模板即可
ps:运行超时,但是填空题我们只需要正确答案即可,答案:20312088;
代码:
import java.util.LinkedList;
import java.util.Queue;
public class 扩散 {
static int [][]arr=new int[10000][10000];
static int ax,ay,bx,by,cx,cy,dx,dy;
static long count=4;
public static void main(String[] args)throws Exception {
init();
bfs();
}
static void init() throws Exception{
ax=3000;
ay=3000;
bx=5020;
by=3011;
cx=3011;
cy=3014;
dx=5000;
dy=5000;
arr[ax][ay]=1;
arr[bx][by]=1;
arr[cx][cy]=1;
arr[dx][dy]=1;
}
static void bfs(){
Queue<Integer>qx=new LinkedList<>();
Queue<Integer>qy=new LinkedList<>();
qx.add(ax);
qx.add(bx);
qx.add(cx);
qx.add(dx);
qy.add(ay);
qy.add(by);
qy.add(cy);
qy.add(dy);
int k=0;
int t=4;
int x,y,xa,ya,s=0;
while (k<2020){
while (t>0){
x=qx.poll();
y=qy.poll();
t--;
for (int i=-1;i<2;i++){
xa=x+i;
if (arr[xa][y]==0){
qx.add(xa);
qy.add(y);
arr[xa][y]=1;
count++;
s++;
}
}
for (int i=-1;i<2;i++){
ya=y+i;
if (arr[x][ya]==0){
qx.add(x);
qy.add(ya);
arr[x][ya]=1;
count++;
s++;
}
}
}
k++;
t=s;
s=0;
}
}
}
三、错误票据
原题链接
解析:
这题呢就是查找一下连续数内部少了哪个数和重复了哪个数,将输入的数排序查询即可;
代码:
import java.util.Arrays;
import java.util.Scanner;
public class 错误票据 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();
String ss;
int s=0;
int []brr=new int[1000];
for (int i=0;i<n;i++){
ss=sc.nextLine();
String[] arr =ss.split(" ");
for (int j=0;j<arr.length;j++){
brr[s]= Integer.parseInt(arr[j]);
s++;
}
}
Arrays.sort(brr);
int a=0,b;
for (int i=999;i>0;i--){
if (brr[i]==0){
System.out.print(a);
return;
}
if (brr[i]-brr[i-1]>1&&brr[i-1]!=0){
System.out.print(brr[i]-1+" ");
}
if (brr[i]==brr[i-1]){
a=brr[i];
}
}
}
}
四、倍数问题
原题链接
解析:
这题之前写过一次,在第五天的题解中,如果还不会可以去看一下。
代码:
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int []arr=new int[n];
int []brr=new int[3*k];
int []crr=new int [k];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
int s=0;
for(int i=n-1;i>=0;i--){
if(crr[arr[i]%k]<2){
crr[arr[i]%k]++;
brr[s]=arr[i];
s++;
if(s==3*k)
break;
}
}
long count=0;
for(int i=0;i<s-2;i++){
if(brr[i]*3<=count){
System.out.println(count);
return;
}
for(int j=i+1;j<s-1;j++){
if(brr[i]+brr[j]*2<=count){
break;
}
for(int m=j+1;m<s;m++){
if(brr[i]+brr[j]+brr[m]<=count){
break;
}
if((brr[i]+brr[j]+brr[m])%k==0){
count=Math.max(count,brr[i]+brr[j]+brr[m]);
break;
}
}
}
}
}
}