第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 | 小宝的幸运数组

小宝的幸运数组

https://ac.nowcoder.com/acm/contest/11746/B

题目

图片说明

思路

其实我也不会,单纯解读一下别人的代码
题目要求幸运子数组中所有数的和能被k整除
小学二年级数学知识我们知道:

图片说明

所以我们只需要计算数组和的前缀和,然后把前缀和求余k,再看看何时出现了一样的余数或者被k整除即可

为了判断何时出现了一样的余数,我们声明一个数组pos来记录这个余数第一次出现的位置,-1表示未出现过,并且让pos[0]=0(被k整除的情况)
这样每次把数组和求余k以后判断pos是否为-1,如果是-1就记录余数第一次出现的位置,如果不是-1,则直接拿当前数的位置减去pos的位置,看看长度是否为最大即可

代码

#include <iostream>
#include <memory.h>

using namespace std;

int main() {
    //工具人变量temp
    int temp;
    //数据的组数T
    int T;
    //幸运数字k
    int k;
    //数组长度n
    int n;
    //数组中前i个数的和除以k的余数
    int sum[100005] = {0};
    //以sum[i]%k为下标,记录这个余数出现的第一个位置,-1表示未出现过
    int pos[100005] = {-1};

    cin >> T;
    while (T-- > 0) {
        //清一下pos数组
        memset(pos, -1, sizeof(pos));
        //如果余数为0说明第1到第i个数字的和正好被k整除
        //即幸运子数组的长度为i
        pos[0] = 0;
        //最长幸运子数组的长度
        int maxLength = -1;
        cin >> n >> k;
        for (int i = 1; i <= n; ++i) {
            cin >> temp;
            sum[i] = sum[i - 1] + temp;
            sum[i] %= k;
            //看看这个余数之前有没有出现过
            //如果没出现过,记录出现的位置
            //如果出现过,记录一下数组长度
            if (pos[sum[i]] == -1) {
                pos[sum[i]] = i;
            } else {
                maxLength = max(maxLength, (int) (i - pos[sum[i]]));
            }
        }
        cout << maxLength << endl;
    }
}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
02-10 13:41
西南大学 Java
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务