bluecode-20240828_2_元素消除

184 阅读1分钟

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:简单
出题人:root

描述

给定一个整数数组nums,同时给定一个整数interval。
指定数组nums中的某个元素作为起点,然后以interval为间隔递增,如果递增的数(包含起点)等于nums中的元素,则将数组nums中对应的元素消除,返回消除元素最多的起点元素。如果消除的元素同样多,则返回最小的起点元素。

输入描述

输入格式:
第一行输入整数数组的长度n
第二行输入长度为n的整数数组nums
第三行输入整数interval
1 <= n <= 10^5
0 <= nums[i] <= 10^8
0 <= interval <= 10^5

输出描述

起点元素的最小值

用例输入 1 **

6 
4 5 7 1 1 2 
3

用例输出 1 **

1

用例输入 2 **

5 
4 5 7 1 2 
50

用例输出 2 **

1
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>

int findBestStart(int& arrayLength, std::vector<int>& numbers, int& stepInterval) {
    std::unordered_map<int, int> remainderCounts;
    int maxCount = 0;
    int bestStartElement = 1e9; // 初始化为一个较大的值

    // 统计每个数字对 stepInterval 取模后的余数出现的次数
    for (int i = 0; i < arrayLength; ++i) {
        int remainder = numbers[i] % stepInterval;
        remainderCounts[remainder]++;
        maxCount = std::max(maxCount, remainderCounts[remainder]);
    }

    // 找到具有最高出现次数的余数对应的最小原始数字
    for (int i = 0; i < arrayLength; ++i) {
        if (remainderCounts[numbers[i] % stepInterval] == maxCount) {
            bestStartElement = std::min(bestStartElement, numbers[i]);
        }
    }

    return bestStartElement;
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int n;
    std::cin >> n;
    std::vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> nums[i];
    }
    int interval;
    std::cin >> interval;

    std::cout << findBestStart(n, nums, interval) << std::endl;

    return 0;
}