第一行 n, k (1 <= n, k <= 105) ,表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。 第二行 n 个数,a1, a2, … , an(1 <= ai <= 104) 表示小易对每分钟知识点的感兴趣评分。 第三行 n 个数,t1, t2, … , tn 表示每分钟小易是否清醒, 1表示清醒。
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[][] scoremap = new int[n][2]; for(int i = 0; i < n; i++){ scoremap[i][1]=sc.nextInt(); } for(int i = 0; i < n; i++){ scoremap[i][0]=sc.nextInt(); } //用于储存每种叫醒情况的总兴趣值 int[] scores=new int[n]; for(int i=0;i<n;i++){ //克隆原数组 int scoremapClone[][] = new int[scoremap.length][]; for(int j=0;j<scoremap.length;j++){ scoremapClone[j]=scoremap[j].clone(); } //模拟叫醒 for(int j=0;j<k;j++){ if(i+j<n){ scoremapClone[i+j][0]=1; } } //计算总兴趣值,并储存 for(int j=0;j<n;j++){ if(scoremapClone[j][0]==1){ scores[i]+=scoremapClone[j][1]; } } } //找出最大值 int max = Arrays.stream(scores).max().getAsInt(); System.out.println(max); } }
结果
AC 0.5 ,运行超时。 反思:克隆数组花费了大量时间,其实可以不模拟每次修改后的状态,只做实时运算。于是对代码做出改进。 其实每次的运算结果也不用都保存起来,最后再取最大值。只要保存一个当前最大值就可以了。
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n= sc.nextInt(); int k= sc.nextInt(); int[][] scoremap = new int[n][2]; for(int i = 0; i < n; i++){ scoremap[i][1]=sc.nextInt(); } for(int i = 0; i < n; i++){ scoremap[i][0]=sc.nextInt(); } //最大兴趣值 int max = 0; for(int i=0;i<n;i++){ //储存当前叫醒可获得的兴趣值 int cur = 0; //计算叫醒可以获得的兴趣值 for(int j=0;j<k;j++) { if (i + j < n&& scoremap[i + j][0] == 0) { cur += scoremap[i + j][1]; } } //如果大于max则储存到max if(cur>max){ max = cur; } } //加上固定兴趣值成为总兴趣值 for(int j=0;j<n;j++){ if(scoremap[j][0]==1){ max+=scoremap[j][1]; } } System.out.println(max); } }
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[][] scoremap = new int[n][2]; //最大兴趣值 int stable = 0; for(int i = 0; i < n; i++){ scoremap[i][1]=sc.nextInt(); } //在输入的同时储存固定兴趣值到max for(int i = 0; i < n; i++){ scoremap[i][0]=sc.nextInt(); if(scoremap[i][0]==1){ stable+=scoremap[i][1]; } } //最大兴趣值 int max = 0; for(int i=0;i<n-k+1;i++){ //储存当前叫醒可获得的兴趣值 int cur = 0; //计算叫醒可以获得的兴趣值 for(int j=0;j<k;j++) { if (i + j < n && scoremap[i + j][0] == 0) { cur += scoremap[i + j][1]; } } //如果大于max则储存到max if(cur>max){ max = cur; } } System.out.println(max+stable); } }