14届

1 前缀和+组合数学
2 主要上界 p[i]p[i]p[i+1]*p[i+1]爆掉上界要提前在第一重循环break int128
3 贪心
4 快慢指针
5 tuple用法

include <bits/stdc++.h>

using namespace std;

define int long long

int lcm(int a,int b) {
return a*b/(__gcd(a,b));
}
signed main() {
int n;
cin >> n;
vector H(n);
for (int i = 0; i < n; ++i) cin >> H[i];
int bestS = -1;
tuple<int, int, int>a;
// 暴力枚举所有三枚宝石的组合
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
int Ha = H[i], Hb = H[j], Hc = H[k];
int LCM_ab = lcm(Ha, Hb);
int LCM_ac = lcm(Ha, Hc);
int LCM_bc = lcm(Hb, Hc);
int LCM_abc = lcm(LCM_ab, Hc);
int S = (Ha * Hb * Hc) * LCM_abc / (LCM_ab * LCM_ac * LCM_bc);
if (S > bestS) {
bestS = S;
a = make_tuple(i, j, k);
} else if (S == bestS) {
tuple<int,int,int> c = {Ha, Hb, Hc};
tuple<int,int,int> b = {H[get<0>(a)], H[get<1>(a)], H[get<2>(a)]};
if (c<b) {
a = make_tuple(i, j, k);
}
}
}
}
}

// auto [i, j, k] = a;
vector result = {H[get<0>(a)], H[get<1>(a)], H[get<2>(a)]};
sort(result.begin(), result.end());
for (int v : result) {
cout << v << " ";
}
}

posted @ 2024-05-29 19:53  爱吃湫鰍的喵酱  阅读(13)  评论(0)    收藏  举报