题目心得
总体上,除了题目读起来比较复杂以外,实现起来还挺简单的。经常有需要存储替换最大值的问题,逻辑都是一样的,保持头脑清醒就可以顺利写出来。
max[i] = -1;//标记最大的持续逗留的次数
for(int j=0;j<t;j++){
int x = sc.nextInt();
int y = sc.nextInt();
//条件:xl<=x<=xl && yd<=y<=yu,满足条件就cnt++
if(x>=xl && x<=xr && y>=yd && y<=yu){
//在内部
cnt++;
//刷新max的值
if(max[i]<cnt){
max[i] = cnt;
}
}else{
//如果不在内部,就把cnt清零
cnt = 0;
}
关于输入,做了几道CCF的题,感觉真的需要存储的数据并不多,一般都是边读边用,这样可以节省空间,逻辑上也更加清晰。
完整代码
由于本人学术不精,粘出代码仅供大家参考,欢迎大家参与讨论和批评指正。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int t = sc.nextInt();
int xl = sc.nextInt();
int yd = sc.nextInt();
int xr = sc.nextInt();
int yu = sc.nextInt();
int rep = 0;//经过人数
int res = 0;//逗留人数
int[] max = new int[n];
for(int i=0;i<n;i++){
int cnt = 0;//记录这个居民持续在内部逗留的次数
max[i] = -1;//标记最大的持续逗留的次数
for(int j=0;j<t;j++){
int x = sc.nextInt();
int y = sc.nextInt();
//条件:xl<=x<=xl && yd<=y<=yu,满足就cnt++,
if(x>=xl && x<=xr && y>=yd && y<=yu){
//在内部
cnt++;
//System.out.println("cnt: "+cnt);
//刷新max的值
if(max[i]<cnt){
max[i] = cnt;
//System.out.println("max[i]: "+max[i]);
}
}else{
//如果不在内部,就把cnt清零
cnt = 0;
}
}
if(max[i]>=1 && max[i]<k){
rep++;
//System.out.println("rep:max[i]"+max[i]);
}else if(max[i] >= k){
res++;
//System.out.println("res:max[i]"+max[i]);
}
}
System.out.println(rep+res);
System.out.println(res);
sc.close();
}
}
提交结果: