A. XXXXX

A. XXXXX

原题传送门

题目描述

给你一个序列你可以

  • 从左往右删除多个或0个数字来得到他的子序列
  • 从右往左删除多个或0个数字来得到他的子序列

求不能被 x 整除的最大子序列长度,如果不存在输出 -1

分析

通过题目可以发现,序列的所有子序列即为序列的前缀和和后缀和,枚举判断每一个子序列取最长的哪一个即可

代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;
int a[maxn];
unsigned long long b[maxn];
unsigned long long c[maxn];
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while (T--) {
        int n, x;
        cin >> n >> x;
        for (int i = 0; i < n; i++) cin >> a[i];
        c[0] = a[0];
        for (int i = 1; i < n; i++) c[i] = c[i - 1] + a[i];
        for (int i = n - 1; i >= 0; i--) b[i] = b[i + 1] + a[i];
        int ans1 = -1;
        for (int i = 0; i < n; i++) {
            if (b[i] % x != 0) {
                ans1 = i;
                break;
            }
        }
        if (ans1 != -1)  ans1 = n - ans1;
        int ans2 = -1;
        for (int i = n - 1; i >= 0; i--) {
            if (c[i] % x != 0)  {
                ans2 = i + 1;
                break;
            }
        }
        if (ans1 == -1 && ans2 == -1) cout << -1 << endl;
        else cout << max(ans1, ans2) << endl;
        memset(b, 0, sizeof(b));
    }
    return 0;
}

©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页