2022-6-22 真题练习-前缀和

MT19 K 的倍数
 
warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地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 \1n105  , 0 \le p_i \le 10^5 \0pi105  , 1 \le K \le 10^5 \1K105 

输入描述:

第一行包含一个整数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 }

思路:记录前缀和可以快速计算子串和,剪枝穷举,小于当前长度的直接跳过。

posted on 2022-06-22 09:35  阿ming  阅读(33)  评论(0编辑  收藏  举报

导航