计蒜客-T1271 完美K倍子数组

完美K倍子数组

错误原因:

  当一个数过大时存map时需要考虑的时候将其取余然后在输入的时候就遍历掉,单独遍历map是不科学的

思路:

  1.k的倍数类

  2.非k的倍数但是两个数加起来是k的倍数比如2k+3和3k+(k-3)

  3.对k取余后是k的一半

#include <iostream>
#include<algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include<map>
#include<set>
#include<sstream>
#define endl '\n'
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define mem(a,b) memset(a,b,sizeof(a));
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
map<unsigned int,unsigned int>mt;
int main()
{
    unsigned int n,k,tmp;cin>>n>>k;
    unsigned cnt1=0,cnt2=0,flag=0;
    for(unsigned int i=0;i<n;++i){
        cin>>tmp;
        int t=tmp%k;
        if(t==0) ++cnt1;
        else if(2*t%k==0) ++cnt2;
        else if(!flag){
            mt[t]=1;
            if(mt[k-t]) flag=1;
        }
    }
    unsigned int ans=0;
    if(cnt1==1) cnt1=0;
    if(cnt2==1) cnt2=0;
    ans=max(cnt1,cnt2);
    if(ans==0&&!flag) cout<<-1<<endl;
    else if(ans!=0) cout<<ans<<endl;
    else cout<<2<<endl;
}

  

猜你喜欢

转载自www.cnblogs.com/waryan/p/12684522.html