非整除集合

非整除集合

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

全部评论

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务