fork download
  1. //Kéo xuống dưới copy test :Đ
  2. //Đề Bài: Tìm số lớn nhất tạo ra bởi việc ghép 2 số có tổng các chữ số giống nhau
  3. #include<bits/stdc++.h>
  4. #define ull unsigned long long
  5. #define ll long long
  6. #define all(x) x.begin(), x.end()
  7. using namespace std;
  8. const int maxn = 1e5 + 1;
  9. ll A[maxn];
  10. vector<ll> D[46];
  11. pair<ll, ll> scs[maxn];
  12. int sumDigit(int n) {
  13. int s = 0;
  14. while (n != 0) {
  15. s += n % 10;
  16. n /= 10;
  17. }
  18. return s;
  19. }
  20. int cntDigit(int n) {
  21. int cnt = 0;
  22. while (n != 0) {
  23. cnt++;
  24. n /= 10;
  25. }
  26. return cnt;
  27. }
  28. ll lt[12];
  29. void tenEn() {
  30. lt[0] = 1;
  31. for (int i = 1; i <= 10; ++i) {
  32. lt[i] = lt[i - 1] * 10;
  33. }
  34. }
  35. int main() {
  36. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  37. // freopen("file.inp","r",stdin);
  38. // freopen("file.out","w",stdout);
  39. tenEn();
  40. int n;
  41. ll res = 0;
  42. cin >> n;
  43. for (int i = 1; i <= n; ++i) {
  44. cin >> A[i];
  45. }
  46. sort(A + 1, A + n + 1);
  47. for (int i = 1; i <= n; ++i) {
  48. D[sumDigit(A[i])].push_back(A[i]);
  49. }
  50. for (int i = 0; i <= 45; ++i) {
  51. if (D[i].size() < 2) continue;
  52. ll a = (D[i][D[i].size() - 1] * lt[scs[D[i].size() - 2].first] + D[i][D[i].size() - 2]);
  53. ll b = (D[i][D[i].size() - 2] * lt[scs[D[i].size() - 1].first] + D[i][D[i].size() - 1]);
  54. res = max(res, max(a, b));
  55. }
  56. cout << res;
  57. }
Success #stdin #stdout 0.01s 5280KB
stdin
6
47 77 95 12 3 3000
stdout
300012