通过使用map容器存储每张试卷题的个数对k取余的值 及key=0,证明有mp[key]张试卷题数是k的倍数,可以单独放到一天 然后key和k-key两组数放到一天计算后mp[k-key]置零防止重复计算

#include<bits/stdc++.h> #include<unordered_map> #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll;

map<int,int> mp; int n, k;

void solve() { cin >> n >> k; int cnt=0; for (int i = 0; i < n; i++) { int a; cin >> a; mp[a%k]++; }

// v的取值区间 1~k-1
for(auto &[v,w]:mp){
    if(v==0){
        cnt+=w;
        continue;
    }
    //如果k是2的倍数 mp[v]一定是2的倍数
    if(2*v==k)
        cnt+=(w/2);
    else{
         cnt+=min(w,mp[k-v]);
        mp[k-v]=0;
    }
}
cout<<cnt<<endl;

}

int main() { IOS; int _ = 1; //cin >> ; while (--) { solve(); } return 0; }