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