磨刀

来源:互联网 发布:word 矩阵对齐 编辑:程序博客网 时间:2024/06/10 06:18

1.

问题描述:给定一个序列,长度为n(1 <= n <= 10^8),询问元素和能被k整除的连续字串的最大长度。

输入描述:先输入n,表示序列长度,接下来输入n个数。

5

1 2 3 4 5

输出描述:输出满足条件的最大长度。

5

分析:计算以每个位置结尾的序列和,并对k取模。如果有两个位置模相等,则这两个位置之间的数(包含右边位置本身)之和就是k的倍数。

#include <cstdio>#include <map>#include <iostream>using namespace std;#define ll long long#define MAX(a, b) ((a) > (b)? (a): (b))#define MIN(a, b) ((a) > (b)? (b): (a))const int num = 1e6 + 5;const int MAXN = 0x3f3f3f3f;//INT_MAX; int a[num], n, k, res;int dp[num];int main() {        //freopen("data/meituan1.txt", "r", stdin);    while (scanf("%d", &n) != EOF) {        for (int i = 0; i < n; ++i) {            scanf("%d", &a[i]);        }        scanf("%d", &k);        dp[0] = a[0] % k;        res = dp[0] == 0 ? 1 : 0;        for (int i = 1; i < n; ++i) {            dp[i] = (dp[i - 1] + a[i]) % k;            if (dp[i] == 0) res = i + 1;        }        for (int i = 1; i <= k; ++i) {            int l = 0, r = n - 1;            while (dp[l] != i && l < r) ++l;            while (dp[r] != i && l < r) --r;            res = MAX(res, r - l);        }        printf("%d\n", res);    }    return 0;}


原创粉丝点击