CCF准备日记——2020.12.02

CCF准备日记——2020.12.02


题目编号:202009-2
题目名称:风险人群筛查
使用语言:Java(Eclipese)
题目描述

CCF准备日记——2020.12.02
CCF准备日记——2020.12.02
我的代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int n= scanner.nextInt();//n个居民
		int k = scanner.nextInt();//连续k个算逗留
		int t = scanner.nextInt();//t个时刻,也就是每个居民有t组位置
		int xl = scanner.nextInt();//边界左下角x
		int yd = scanner.nextInt();//边界左下角y
		int xr = scanner.nextInt();//边界右上角x
		int yu = scanner.nextInt();//边界右上角y
		int locations[][][] = new int[n][t][2];//n个居民,每个居民t组坐标,每组坐标xy两个值
		int temp1 = 0;//临时变量用来承接键盘输入
		int temp2 = 0;//临时变量用来承接键盘输入
		for(int i=0;i<n;i++) {
			for(int j=0;j<t;j++) {
				temp1 = scanner.nextInt();
				temp2 = scanner.nextInt();
				locations[i][j][0] = temp1;
				locations[i][j][1] = temp2;
			}
		}
		//System.out.println(xl+";"+locations[1][2][0]);
		int num_pass = 0;//经过人数
		int num_stay = 0;//逗留人数,连续经过天数>=k
		int isPass = 0;//每次外层循环是否经过
		int lastPass = 0;//上一时刻是否经过
		int cur_days = 0;//当前连续经过天数
		int max_days = 0;//最大连续经过天数
		for(int i=0;i<n;i++) {
			isPass = 0;//先设置为未经过
			lastPass = 0;
			cur_days = 0;
			max_days = 0;
			for(int j=0;j<t;j++) {
				if(locations[i][j][0]>=xl && locations[i][j][0]<=xr && locations[i][j][1]>=yd && locations[i][j][1]<=yu) {
					isPass = 1;//设置该对象经过疫情区
					if(lastPass == 0) {//如果上一时刻未经过
						cur_days = 1;//从今天开始记经过天数
					}
					if(lastPass == 1) {//如果上一时刻经过
						cur_days++;//连续经过天数++
					}
					lastPass = 1;//设置上一时刻经过
					//判断是否要更新max_days
					max_days = cur_days>=max_days?cur_days:max_days;
					
				}else {
				//如果当天未经过,那么设置上一时刻未经过,连续天数记录中断归0
					lastPass = 0;
					cur_days = 0;
				}
			}
			//统计经过疫情区人数
			if(isPass == 1) {
				num_pass++;
			}
			//统计逗留疫情区人数
			if(max_days >= k) {
				num_stay++;
			}
		}
		System.out.println(num_pass);
		System.out.println(num_stay);

	}

}

我的分析

  • 第二题的完成过程就明显比第一题顺利了许多,因为我对于Java代码的基本书写格式已经逐渐掌握,对于题目的解答逻辑步骤也越来越清晰。总结来说基本解题步骤为:
  • 1.思考题目中用到的数据结构,既题目中叙述的实际问题以及实体对象我们用什么数据结构来存储表示,简单用变量+数组就可以解决还是使用面向对象的思想更好。然后我们就要去声明实现所需要的实体类,完善类内部的属性、构造函数、getter\setter一类的方法。
  • 2.声明定义题目中所需要的各种变量,最好对每个变量都添加上详细的注释并且变量取名也要与实际意义有所关联容易区分。
  • 3.按照题目要求的格式以及顺序完成所需数据的输入工作,当然大概率是要用到Scanner对象。需要注意的是一些特殊结构的使用赋值,比如对象数组、高维数组等等。
  • 4.完成以上基本的准备工作后就可以开始代码核心逻辑的实现了,这一部分每道题目都会有较大的差别。但需要我们灵活使用一些现有的函数及包,比如Arrays、Comparorator等等。最后一部分就是根据题目要求完成结果的输出就好了。
  • 看了其他人写的这道题的答案,思路大同小异并且也都没有什么很出彩的思路。但我也发现了一处可以优化的地方,就是可以将三维数组的初始化与代码核心逻辑部分一起进行,这样就会少一组二重循环。但缺点是这样做题思路就不够清晰,不满足我上面写的先完成输入再去处理核心逻辑的思路。
上一篇:[php][零散代码]php日期计算


下一篇:TypeScript-初级-04-枚举