有关整除,倍数等问题可以试试转化成余数来做。
这是一道华为的笔试题。
本答案仅供参考。
#include<bits/stdc++.h>
using namespace std;
// 计算余数数组,如果配对能成,则两数余数相加一定等于average或0
int main(){
int average, N; // 历史平均得分和人数
cin>>average>>N;
N = N * 2;
// cout<<"average: "<<average<<" 2*N: "<<N<<endl;
// 初始化分数数组
vector<int> scores;
for(int i = 0; i < N; ++i){
int t;
cin>>t;
scores.push_back(t);
}
sort(scores.begin(), scores.end());
reverse(scores.begin(), scores.end());
// for(auto &s : scores) cout<<s<<endl;
vector<pair<int, int>> temp; // 储存索引对,余数和索引
unordered_map<int, int> map; // 储存余数和余数个数
for(int i = 0; i < N; ++i){
int t;
// cout<<scores[i];
if(scores[i] < 0) t = scores[i] % average + average;
else t = scores[i] % average;
temp.push_back(make_pair(t, i));
map[t]++;
}
// for(auto &m : map){
// cout<<m.first<<" "<<m.second<<endl;
// }
// 判断某个余数是否有配对余数,且配对余数个数相同
for(auto &m : map){
if(m.first == 0){
if(m.second % 2 == 0) continue;
else{
// cout<<"余数为0个数非偶数"<<endl;
return 0;
}
}
else{
auto iter = map.find(average - m.first); // 相加等于5则有机会配对
if(iter == map.end()){ // 没有能配成5的余数
// cout<<"没有能配成average的余数"<<endl;
cout<<0<<endl;
return 0;
}else if(m.second != iter->second){ // 有能配成5的余数,但数目不同
// cout<<"余数个数不相等"<<endl;
cout<<0<<endl;
return 0;
}
}
}
vector<int> ans; // 结果数组
// 选择之后的索引变-1
for(auto &t : temp){
if(t.second == -1) continue;
ans.push_back(scores[t.second]);
// cout<<"t.first: "<<t.first;
t.second = -1;
for(auto &tt : temp){
if(tt.second == -1) continue;
else if(t.first + tt.first == average || t.first + tt.first == 0){ //
ans.push_back(scores[tt.second]);
// cout<<" tt.first: "<<tt.first<<endl;
tt.second = -1;
break;
}
}
}
for(auto &a : ans){
cout<<a<<endl;
}
return 0;
}