2022-6-22 真题练习-前缀和
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
序列中任意个连续的元素组成的子序列称为该序列的子串。
现在给你一个序列 P 和一个整数 K ,询问元素和是 K 的倍数的子串的最大长度。
比如序列 [1,2,3,4,5],给定的整数 K 为 5,其中满足条件的子串为 {5}、{2,3}、{1,2,3,4}、{1,2,3,4,5} ,
那么答案就为 5,因为最长的子串为 {1,2,3,4,5} ; 如果满足条件的子串不存在,就输出 0。
数据范围: 1 \le n \le 10^5 \1≤n≤105 , 0 \le p_i \le 10^5 \0≤pi≤105 , 1 \le K \le 10^5 \1≤K≤105
输入描述:
第一行包含一个整数N, 1 ≤ 𝑁 ≤ 105。
第二行包含 N 个整数𝑝𝑖,𝑝𝑖表示序列P第i个元素的值。0 ≤ 𝑝𝑖 ≤ 105。第三行包含一个整数K,1 ≤ 𝐾 ≤ 105。
输出描述:
输出一个整数ANS,表示答案。
1 import java.util.*; 2 public class Main{ 3 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int n = sc.nextInt(); 7 long s=0; 8 long[] sum=new long[n+1]; 9 for (int i=1;i<=n;i++){ 10 int t=sc.nextInt(); 11 s+=t; 12 sum[i]=s; 13 } 14 int k=sc.nextInt(); 15 int ans=0; 16 //System.out.println(s); 17 for (int i=n;i>=1;i--){ 18 if (i<=ans) break; 19 for (int j=0;j<i;j++){ 20 if (i-j<=ans) break; 21 if ((sum[i]-sum[j])%k==0) ans=Math.max(ans,i-j); 22 } 23 } 24 System.out.println(ans); 25 } 26 27 }
思路:记录前缀和可以快速计算子串和,剪枝穷举,小于当前长度的直接跳过。