码迷,mamicode.com
首页 > 编程语言 > 详细

hihocoder-1796-完美K倍子数组

时间:2018-09-09 22:13:41      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:print   als   存在   can   ext   turn   ret   hal   const   

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; 
} 

  

 

hihocoder-1796-完美K倍子数组

标签:print   als   存在   can   ext   turn   ret   hal   const   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!