fork(1) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // Speed
  5. #define fast_io ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  6.  
  7. // Typedefs
  8. #define int long long
  9. #define pb push_back
  10. #define ff first
  11. #define ss second
  12. #define all(x) (x).begin(), (x).end()
  13. #define rall(x) (x).rbegin(), (x).rend()
  14. #define sz(x) ((int)(x).size())
  15. #define endl '\n'
  16.  
  17. // Loops
  18. #define rep(i,a,b) for(int i=a;i<b;++i)
  19. #define per(i,a,b) for(int i=b-1;i>=a;--i)
  20.  
  21. // Consts
  22. const int INF = 1e18;
  23. const int MOD = 1e9+7;
  24. const int N = 2e5 + 5;
  25.  
  26. // Logic
  27. void solve() {
  28. int n;
  29. cin >> n;
  30. vector<int> a(n);
  31. rep(i, 0, n) cin >> a[i];
  32. sort(rall(a));
  33.  
  34. // For symmetry and strictly convex, we try even lengths (2k) as sides for regular polygons
  35. int max_perimeter = 0;
  36. // Try largest possible even/odd m, starting from n down to 3 (polygon needs at least 3 sides)
  37. for (int m = n; m >= 3; --m) {
  38. // symmetry: for regular polygons, all sides equal,
  39. // otherwise, even-length palindromes are possible, but for maximum perimeter, longest sides are preferable
  40. // So: for m, check if we can use the first m (all must fit polygon inequality).
  41. int sum = 0;
  42. rep(i, 0, m) sum += a[i];
  43. // Check polygon condition: largest < sum of others
  44. if (a[0] < sum - a[0]) {
  45. max_perimeter = sum;
  46. break; // Largest valid perimeter
  47. }
  48. }
  49. cout << max_perimeter << endl;
  50. }
  51.  
  52. // Main
  53. int32_t main() {
  54. fast_io;
  55. int t = 1;
  56. cin >> t;
  57. while (t--) {
  58. solve();
  59. }
  60. return 0;
  61. }
  62.  
Success #stdin #stdout 0s 5320KB
stdin
5
3
5 5 7
3
4 5 7
3
5 5 10
7
4 3 5 1 5 3 3
4
2 3 5 7
stdout
17
16
0
24
17