非整除集合
非整除集合
http://www.nowcoder.com/questionTerminal/361ff5dd893c4e11856735e52007fca7
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n; //元素数量
int k; //任意俩个数不能被k整除
cin>>n>>k;
int s[10000]={0};
for(int i=0;i<n;i++){
cin>>s[i];
}
int MaxLong=0;//最大长度
int YuShu[100]={0};//存放余数的个数
for(int i=0;i<n;i++){
YuShu[s[i]%k]++;//计算每个数字的余数
//并记录余数为0,1,2,3等的个数
}
if(YuShu[0]!=0){//如果有整除的 只能取一个
MaxLong++; //最大长度+1
}
if(k%2==0){//k是2的倍数
if(YuShu[k/2]!=0)//只能取一个
MaxLong++; //最大长度+1
for(int i=1;i<k/2;i++){
if(YuShu[i]<YuShu[k-i])//贪心,哪个多就取哪个
MaxLong=MaxLong+YuShu[k-i];
else
MaxLong=MaxLong+YuShu[i];
}
}
else{ //k不是2的倍数
for(int i=1;i<=k/2;i++){
//这里我不知道为什么非要是i<=k/2
//我认为只i<k/2也应该可以
//但是如果是i<k/2就只能通过60%
//有没有大佬可以解答一下啊
if(YuShu[i]<YuShu[k-i])//贪心,哪个多就取哪个
MaxLong=MaxLong+YuShu[k-i];
else
MaxLong=MaxLong+YuShu[i];
}
}
cout<<MaxLong<<endl;
return 0;
}计算出每个数字除以k的余数,记录次数,然后存到数组里,操作: YuShu[s[i]%k]++;//计算每个数字的余数,用来记录余数为0,1,2,3等的个数;设一个变量 MaxLong=0,用来记录结果(最大长度);然后第一步 就是看有没有可以整除k的,如果有,只能取一个,MaxLong++;(因为S·集合任意俩个数字都不能被k整除,如果从可以整除k的取超过一个就不符合题意,所以最多只能取一个); 第二步 看k是否是2的倍数 如果是2的倍数,比如说6 那么余数只能是0 1 2 3 4 5 余数为2和4的只能取一种,取余数为2的就不能取4同理取余数为1的就不能取5 这里是要求最大长度 ,所以用贪心的思想 ,比较哪个大就取哪个 ,然后就是要看一下有没有余数为k/2的,如果有只能取一个,MaxLong++;如果不是2的倍数 比是2的倍数就少一个看一下有没有余数为k/2的,因为k不是2的倍数,所以就不用看,最后输出MaxLong
爱玛科技公司福利 7人发布