#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> p(n);
for (int i = 0; i < n; i++) {
cin >> p[i];
}
sort(p.begin(), p.end());
set<int> visited;
visited.insert(p[0]);
long long total = 0;
for (int i = 1; i < n; i++) {
int x = p[i];
int min_weight = x;
// 检查是否有约数
bool has_divisor = false;
for (int d = 1; d * d <= x; d++) {
if (x % d == 0) {
if (visited.count(d)) {
has_divisor = true;
break;
}
if (d != 1 && visited.count(x / d)) {
has_divisor = true;
break;
}
}
}
if (has_divisor) {
visited.insert(x);
continue;
}
// 找小于x的最大数
auto it = visited.lower_bound(x);
if (it != visited.begin()) {
--it;
int candidate = *it;
min_weight = min(min_weight, x % candidate);
}
// 找最大的p ≤ x/2
it = visited.upper_bound(x / 2);
if (it != visited.begin()) {
--it;
int candidate = *it;
min_weight = min(min_weight, x % candidate);
}
total += min_weight;
visited.insert(x);
}
cout << total << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |