列表

详情


OR168. 非整除集合

描述

给定一个由正整数组成的集合S,找出一个最大的子集合S,使得S中任意两个数字的和都不能被K整除。

例如S=「10,10,12,19,22,24,25」,K=4。此时S最多只能取3个数,可能的取值为「10,12,25」或者「19,22,24」等。

输入描述

输入为两行,第一行两个数字,分别表示集合S的元素数量N和K。第二行为N个数字,分别是S的各个元素值。

数据范围:
1 < N < 10^5
1 < K < 100
1 < S[i] < 10^9

输出描述

输出为一个数字,集合S的最大长度。

示例1

输入:

4 3
1 7 2 4

输出:

3

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-31

#include<stdio.h>
int main()
{
    int N,K,s[10000],r[10000];
    int i,sum=0;
    scanf("%d%d",&N,&K);
    for(i=0;i<N;i++)
    { 
        scanf("%d",&s[i]);
        r[i]=0;
}
    for(i=0;i<N;i++)
    {
        r[s[i]%K]++;
    }
    if(r[0])
        sum++;
    if(K%2==1)
    {
    for(i=1;i<=(K-1)/2;i++)
    {
    	
        if(r[i]>r[K-i])
            sum+=r[i];
        else
        sum+=r[K-i];
    }
}
    else
    {
    for(i=1;i<=K/2;i++)
    {
        if(i==K/2&&r[i/2]>0)
        {
        sum++;
        break;
        }
    	if(r[i]>r[K-i])
            sum+=r[i];
        else
        sum+=r[K-i];
	}
}
    printf("%d",sum);
return 0;
}

C++ 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-07

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int res=0;
    int N,K;
    cin>>N;cin>>K;
    vector<int> num(K,0);
    int number;
    while(cin>>number){
        num[number%K]++;
    }
    res+=num[0]>0?1:0;
    if(K%2!=0){
        for(int i=1;i<(K/2)+1;i++){
        res+=num[i]>num[K-i]?num[i]:num[K-i];
        }
    }
    else if(K%2==0){
        res+=num[K/2]>0?1:0;
        for(int i=1;i<=(K/2)-1;i++){
        res+=num[i]>num[K-i]?num[i]:num[K-i];
        }
    }
    //if(K%2!=0) res+=num[(K/2)+1];
    cout<<res;
    return 0;
}

上一题