hihocoder-1796-完美K倍子数组

hihocoder-1796-完美K倍子数组 

#1796 : 完美K倍子数组

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

如果一个数组满足长度至少是2,并且其中任意两个不同的元素Ai和Aj (i ≠ j)其和Ai+Aj都是K的倍数,我们就称该数组是 完美K倍数组。

现在给定一个包含N个整数的数组A = [A1, A2, ... AN]以及一个整数K,请你找出A的最长的完美子数组B,输出B的长度。

如果这样的子数组不存在,输出-1。

输入

第一行包含两个整数N和K。

第二行包含N个整数A1, A2, ... AN。

1 ≤ N ≤ 100000

1 ≤ Ai, K ≤ 1000000000

输出

一个整数,表示答案。

样例输入
5 3
1 3 2 3 6
样例输出
3

题解:

  对于K倍,需要同时关注K倍的和 K 倍 余K/2 的数。

  还需要考虑: 不存在两者时,数组内,是否存在两个数字的和整除K。

#include <cstdio>
#include <iostream>
#include <set>
using namespace std;   

const int MAXN = 100000 + 10; 

int N, K;
int num[MAXN];  

int find_array()
{
    bool is_even;
    if(K%2 == 0)
    {
        is_even = true;
    }else{
        is_even = false;
    }

    int k_full = 0, k_half = 0;
    for(int  i=0; i<N; ++i)
    {
        if(num[i]%K == 0)
        {
            ++k_full;
        }
        if(is_even && num[i]%K==K/2)
        {
            ++k_half;
        }
    }
    int ans = 0;
    if(k_half > k_full)
    {
        if(k_half == 1)
        {
            ans = 0;
        }else{
            ans = k_half;
        }
    }else{
        ans = k_full;
    }
    return ans;
}

bool find_pair()
{
    set<int> vis;
    for(int i=0; i<N; ++i)
    {
        int remain = num[i]%K;
        if(vis.count(K - remain)){
            return true;
        }
        vis.insert(remain);
    }
    return false;
}

int main(){ 

    int ans;
    scanf("%d %d", &N, &K);    

    for(int i=0; i<N; ++i)
    {
        scanf("%d", &num[i]);
    }
    if(N <= 1)
    {
        printf("-1\n");
        return 0;
    }
    ans = find_array();
    if(ans < 2)
    {
        if(find_pair()){
            ans = 2;
        }else{
            ans = -1;
        }
    }
    printf("%d\n",  ans); 

    return 0;
}

  

原文地址:https://www.cnblogs.com/zhang-yd/p/9615088.html

时间: 2024-10-10 17:15:44

hihocoder-1796-完美K倍子数组的相关文章

713. 乘积小于K的子数组

给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]. 需要注意的是 [10,5,2] 并不是乘积小于100的子数组. 说明: 0 < nums.length <= 50000 0 < nums[i] < 1000 0 <

Leetcode 560.和为k的子数组

和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 说明 : 数组的长度为 [1, 20,000]. 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]. 思路 灵活使用map来解决问题 1 import java.util.HashMap; 2 import java.util

leecode第五百六十题(和为K的子数组)

class Solution { public: int subarraySum(vector<int>& nums, int k) { int cur = 0, res = 0; unordered_map<int, int> um; // 注意这里前缀和多了一个0,防止漏掉数组的前缀和刚好等于k的情况 um[0] = 1; for (int num : nums) { cur += num; res += um.find(cur - k) == um.end() ? 0

【算法30】从数组中选择k组长度为m的子数组,要求其和最小

原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$l_2$, $r_2$], ..., [$l_k$l1, $r_k$] (1 ≤ $l_1$ ≤$r_1$ ≤$l_2$ ≤ $r_2$ ≤... ≤$l_k$ ≤ $r_k$ ≤ n; $r_i-r_i+1$), 使得$\sum_{i=1}^{k}\sum_{j=l_i}^{r_i}p_j$ 问题

Leetcode523. 连续的子数组和

链接:https://leetcode-cn.com/problems/continuous-subarray-sum 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: 输入: [23,2,4,6,7], k = 6输出: True解释: [2,4] 是一个大小为 2 的子数组,并且和为 6.示例 2: 输入: [23,2,6,4,7], k = 6输出: Tru

查找环形数组的和最大的连续子数组

设计思想: 把一个数组连成环,查找这个环的和最大的连续子数组时走到原来的数组尾部可以再继续加第一个元素,所以等价于构建一个原来数组2倍的数组 查找和最大的连续子数组方法: 设原先数组两倍的数组名为a,长度为2n - 1,原数组长度为n 定义一个当前的总和currectSum,初始值为a[0];定义一个当前总和的开始加和的位置下标currectStartIndex,初始值为0:定义一个记录连续加了多少个数的变量count,初始值为1.定义一个长度为3的结果数组result,用来存放最终找到的和最大

算法 | 最大连续子数组

最大连续子数组 给定一个数组A[0,1,-,n-1],求A的连续子数组,使得该子数组的和最大. 例如: 数组:1,-2,3,10,-4,7,2,-5 最大字数组:3,10,-4,7,2 此问题有以下四种方法 1.  暴力法 2.  分治法 3.  分析法 4.  动态规划法 暴力法 直接求解A[I,-j]的值,其中,0<=i<n,i<=j<n,因为i,i+1,-j的最大长度为n,所以时间复杂度O(n3). //暴力法 int MaxSubArray(int *a, int n) {

查找数组连成环形的和最大的连续子数组

1 package zuoYe; 2 3 import java.util.Scanner; 4 5 6 public class MaxSubArray { 7 public static void main(String[] args) { 8 Scanner scan = new Scanner(System.in); 9 10 11 //输入数据 12 System.out.println("请输入数组长度"); 13 int n = scan.nextInt(); 14 in

最大连续子数组和

    最大连续子数组和 1. 题目描述 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值,要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. 2. 解法一:三层搜索 这个解法使用了3层搜索,时间复杂度为O(n^3). 第一层搜索:i遍历数组中所有数,作为子数组的起始点: 第二层搜索:j遍历