第一题:贪心找到最长进步序列求差值: 大规模数据读入不要使用Scanner,要用BufferedReader

//运行时间1722ms占用内存37532KB
import java.util.*;
import java.io.*;
public class Main{
    public static void main(String args[])throws IOException{
        int arr[]=new int[100005];
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(System.out);
        Scanner sc=new Scanner(System.in);
        int t=Integer.parseInt(bf.readLine());
        for(int i=0;i<t;i++){
            int n=Integer.parseInt(bf.readLine());
            String s[]=bf.readLine().split(" ");
            for(int j=0;j<n;j++){arr[j]=Integer.parseInt(s[j]);}
            int d=-1;
            int l=0,r=1;
            List<Integer> list=new ArrayList<>();
            while(r<=n){
                if(r<n&&arr[r]>=arr[r-1]){r++;}
                else{
                    int k=arr[r-1]-arr[l];
                    if(k>d){
                        list=new ArrayList<>();
                        list.add(l+1);
                        list.add(r);
                        d=k;
                    }
                    else if(k==d){
                        list.add(l+1);
                        list.add(r);
                    }
                    l=r;
                    r++;
                }
            }
            for(int j=0;j<list.size();j++){
                System.out.print(list.get(j));
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}

第二题:枚举每个点判断周围即可:

//运行时间1270ms占用内存62200KB
import java.io.*;
import java.util.*;
public class Main{
    static int[][] d={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
    public static void main(String args[])throws IOException{
        //P:植物;*:保护伞;Z:僵尸
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        //PrintWriter pw = new PrintWriter(System.out);
        int t=Integer.parseInt(bf.readLine());
        for(int i=0;i<t;i++){
            Set<Long> set=new HashSet<>();//记录被保护的植物
            String s[]=bf.readLine().split(" ");
            int n=Integer.parseInt(s[0]);
            int m=Integer.parseInt(s[1]);
            char c[][]=new char[n][m];
            for(int j=0;j<n;j++){c[j]=bf.readLine().toCharArray();}
            int count=0;//植物的数量
            for(int x=0;x<n;x++){
                for(int y=0;y<m;y++){
                    char ch=c[x][y];
                    if(ch=='P'){count++;}
                    else if(ch=='*'){
                        for(int p=0;p<8;p++){addPlants(x+d[p][0],y+d[p][1],n,m,c,set);}
                    }
                }
            }
            System.out.println(count-set.size());
        }
    }
    public static void addPlants(int x,int y,int n,int m,char c[][],Set<Long> set){
        if(x==-1||y==-1||x==n||y==m||c[x][y]!='P'){return;}
        //System.out.println(x+" "+y);
        set.add((long)10000000*(long)x+(long)y);
    }
}