1. 程式人生 > 其它 >1366: [藍橋杯2018初賽]倍數問題

1366: [藍橋杯2018初賽]倍數問題

技術標籤:藍橋杯c++演算法stack

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; }