zoukankan      html  css  js  c++  java
  • 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
    "); 
            return 0; 
        }
        ans = find_array();  
        if(ans < 2)
        {
            if(find_pair()){
                ans = 2; 
            }else{
                ans = -1; 
            } 
        }
        printf("%d
    ",  ans); 
    
        return 0; 
    } 
    

      

  • 相关阅读:
    HDU 2011 (水)
    HDU 2010 (水)
    HDU 2009 (水)
    HDU 2007 (水)
    mcsscm
    Meow~
    沉沦魔是战5渣
    谈谈和81的过往
    量子力学就像一座破房子 Quantum power is like a broken house.
    能源危机的应对方案(基于Energy不守恒定律)Response to the Energy Crisis (Based on the Law of Mana Non-Conservation)
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/9615088.html
Copyright © 2011-2022 走看看