MT19. K 的倍数
描述
序列中任意个连续的元素组成的子序列称为该序列的子串。比如序列 [1,2,3,4,5],给定的整数 K 为 5,其中满足条件的子串为 {5}、{2,3}、{1,2,3,4}、{1,2,3,4,5} ,
输入描述
第一行包含一个整数N, 1 ≤ 𝑁 ≤ 105。第二行包含 N 个整数𝑝𝑖,𝑝𝑖表示序列P第i个元素的值。0 ≤ 𝑝𝑖 ≤ 105。第三行包含一个整数K,1 ≤ 𝐾 ≤ 105。
输出描述
输出一个整数ANS,表示答案。示例1
输入:
5 1 2 3 4 5 5
输出:
5
示例2
输入:
6 3 1 2 7 7 7 4
输出:
5
C++ 解法, 执行用时: 12ms, 内存消耗: 1292KB, 提交时间: 2020-08-29
#include <iostream> using namespace std; int main() { long long n; scanf("%d", &n); long long p[n+1]; p[0] = 0; for(int i=1 ; i<=n ; i++) { scanf("%lld", &p[i]); p[i] += p[i-1]; } int k; scanf("%d", &k); for(int len=n ; len>0 ; len--) { for(int i=0 ; i<=n-len ; i++) { int j = i + len; if((p[j]-p[i]) % k == 0) { cout << len << endl; return 0; } } } cout << 0 << endl; }
C++14 解法, 执行用时: 13ms, 内存消耗: 1608KB, 提交时间: 2020-07-28
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_SIZE = 100005, INF = 0x3f3f3f3f; //-----------------INPUT-----------------// int n, k, nums[MAX_SIZE]; int rec[MAX_SIZE]; int solve() { int ans = 0, cur = 0; memset(rec, 0x3f, k * sizeof rec[0]); rec[0] = -1; for (int i = 0; i < n; ++i) { cur = (cur + nums[i]) % k; ans = max(ans, i - rec[cur]); rec[cur] = min(rec[cur], i); } return ans; } int main() { while (scanf("%d", &n) == 1) { for (int i = 0; i < n; ++i) scanf("%d", nums + i); scanf("%d", &k); printf("%d\n", solve()); } }