OR168. 非整除集合
描述
输入描述
输入为两行,第一行两个数字,分别表示集合S的元素数量N和K。第二行为N个数字,分别是S的各个元素值。输出描述
输出为一个数字,集合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; }