题解 | 第44场小白月赛

深渊水妖

https://ac.nowcoder.com/acm/problem/231930

第一题:贪心找到最长进步序列求差值: 大规模数据读入不要使用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);
    }
}
全部评论

相关推荐

头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务