1366: [藍橋杯2018初賽]倍數問題
阿新 • • 發佈:2021-01-23
2018省賽A組第9題 倍數問題
題目連結http://oj.ecustacm.cn/problem.php?id=1366
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<int> q[1010];
int a[100010];
int main() {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
for (int i = 0; i < n; i++) {
q[a[i] % k].push(a[i]);
}
int maxx = 0;
for (int i = 0; i < k; i++) {
if (!q[i].size())
continue;
for (int j = i; j < k; j++) {
if (!q[j].size())
continue;
int t = (k - i - j+k)%k;//注意t可能為k、可能為負數
if (!q[t].size()|| t<j)
continue;
else {
int ans1, ans2, ans3;
ans1 = q[i].top();
q[i].pop();
if (!q[j].size()) {//注意不滿足條件一定要把取出來的數放回去
q[i].push(ans1);
continue;
}
else {
ans2 = q[j].top();
q[j].pop();
}
if (!q[t].size()) {//注意不滿足條件一定要把取出來的數放回去
q[j].push( ans2);
q[i].push(ans1);
continue;
}
else {
ans3 = q[t].top();
q[t].pop();
maxx = max(maxx, ans1 + ans2 + ans3);
q[t].push(ans3);//注意一定要把取出來的數放回去
q[j].push(ans2);
q[i].push(ans1);
}
}
}
}
cout << maxx;
return 0;
}