非整除集合
非整除集合
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