VT13 - Cặp đôi hoàn hảo (phiên bản 1)

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Cho mảng số nguyên ~A~ có ~n~ phần tử, hãy tìm 2 phần tử lân cận trong mảng sao cho tổng của chúng là lớn nhất. Giả sử phần tử cuối cùng và phần tử đầu tiên cũng có tính lân cận (tạo thành vòng tròn khép kín)

Input

  • Dòng 1 là số lượng phần tử của mảng ~n~
  • Dòng tiếp theo là ~n~ số nguyên tương ứng là các phần tử của mảng

Giới hạn:

  • ~n \in N^*~ và  ~2 \le n \le 10^4~
  • ~|A_{i}| \le 10^8~

Output

In ra 2 phần tử lân cận nhau (cách nhau bởi 1 dấu cách) thỏa mãn yêu cầu đề bài.

Lưu ý:

  • Giữ nguyên thứ tự ban đầu của chúng
  • Nếu có nhiều kết quả, in ra kết quả ở chỉ số mảng (của phần tử đầu tiên) lớn hơn
  • Nếu phần tử cuối cùng và phần tử đầu tiên là cặp có tổng lớn nhất, in phần tử cuối cùng trước (Xem sample #1).

Sample

Input #1
5
3 2 -1 2 4
Output #1
4 3
Input #2
6
1 2 6 1 6 2
Output #2
6 2

Bình luận

Please read the guidelines before commenting.



  • 0
    NguyenPX11  đã bình luận lúc 12, Tháng 4, 2026, 12:40

    include <bits/stdc++.h>

    define ll long long

    using namespace std; ll n,a[1000011]; int main() { cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } ll max1=a[0]+a[1]; int gay=0; for (int i=1;i<n-1;i++){ ll gay1=a[i]+a[i+1]; if(gay1>max1 || (gay1==max1&&i>gay)){ max1=gay1; gay=i; } } ll pipi=a[n-1]+a[0]; if(pipi>max1 || (pipi==max1&&(n-1)>gay)){ gay=n-1; } if(gay==n-1){ cout<<a[n-1]<< " " <<a[0]; } else { cout<<a[gay]<< " " <<a[gay+1]; } return 0; }


  • 0
    minhtai2013vn  đã bình luận lúc 18, Tháng 3, 2026, 11:53

    FULL minh cho ai cần:

    include <iostream>

    using namespace std;

    int main() { int n; cin >> n;

    long long a[n];
    for (int i = 0; i < n; i++) cin >> a[i];
    
    long long maxSum = a[0] + a[1];
    int pos = 0;
    
    for (int i = 1; i < n - 1; i++) {
        if (a[i] + a[i + 1] > maxSum) {
            maxSum = a[i] + a[i + 1];
            pos = i;
        }
    }
    
    // xét cặp vòng tròn
    if (a[n - 1] + a[0] > maxSum) {
        cout << a[n - 1] << " " << a[0];
    } else {
        cout << a[pos] << " " << a[pos + 1];
    }
    
    return 0;
    

    }


    • 0
      minhtai2013vn  đã bình luận lúc 18, Tháng 3, 2026, 11:53

      include <iostream>

      using namespace std;

      int main() { int n; cin >> n;

      long long a[n];
      for (int i = 0; i < n; i++) cin >> a[i];
      
      long long maxSum = a[0] + a[1];
      int pos = 0;
      
      for (int i = 1; i < n - 1; i++) {
          if (a[i] + a[i + 1] > maxSum) {
              maxSum = a[i] + a[i + 1];
              pos = i;
          }
      }
      
      // xét cặp vòng tròn
      if (a[n - 1] + a[0] > maxSum) {
          cout << a[n - 1] << " " << a[0];
      } else {
          cout << a[pos] << " " << a[pos + 1];
      }
      
      return 0;
      

      }


  • 0
    minhtai2013vn  đã bình luận lúc 18, Tháng 3, 2026, 11:51

    full bài cho anh em tui thử và thành công:

    include <iostream>

    using namespace std;

    int main() { int n; cin >> n;

    long long a[n];
    for (int i = 0; i < n; i++) cin >> a[i];
    
    long long maxSum = a[0] + a[1];
    int pos = 0;
    
    for (int i = 1; i < n - 1; i++) {
        if (a[i] + a[i + 1] > maxSum) {
            maxSum = a[i] + a[i + 1];
            pos = i;
        }
    }
    
    // xét cặp vòng tròn
    if (a[n - 1] + a[0] > maxSum) {
        cout << a[n - 1] << " " << a[0];
    } else {
        cout << a[pos] << " " << a[pos + 1];
    }
    
    return 0;
    

    }


  • -1
    phuthien123  đã bình luận lúc 18, Tháng 3, 2026, 11:47 chỉnh sửa

    bài hay


    • -1
      phuthien123  đã bình luận lúc 18, Tháng 3, 2026, 11:48

      bài hay!


  • 1
    TOP1FLOVN  đã bình luận lúc 15, Tháng 2, 2026, 13:58

    ai hỏi


  • -1
    hoangtitan555  đã bình luận lúc 2, Tháng 2, 2026, 9:30 chỉnh sửa

    adsad aádadsdadsadsa


  • -1
    hoangtitan555  đã bình luận lúc 2, Tháng 2, 2026, 9:25 sửa 2

    code thường thôi dc rồi

    include<bits/stdc++.h>

    define inf -1e9

    using namespace std; int tong(int a, int b){ return a+b; } int main(){ int n; cin>>n; vector <long> a(n); for (int i = 0; i < n; i++) cin>>a[i]; int smax =inf, vitri =0, temp; for (int i = 0; i < n-1; i++){ temp = tong(a[i], a[i+1]); if ( temp > smax) { smax = temp; vitri = i; } } if (tong(a[0], a[n-1]) > smax) { cout<<a[0]<<" "<<a[n-1]; } else cout<<a[vitri]<<" "<<a[vitri+1];

    return 0;
    

    }


  • -1
    nhankiettvt  đã bình luận lúc 29, Tháng 1, 2026, 8:30

    bài này ko khê lắm nha ae=))

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
        vector<int> a(n + 1);
        for (int i = 1; i <= n; i++)
            cin >> a[i];
    
        ll cur_max = LLONG_MIN;
        int bestL = 1, bestR = 2;
    
        for (int l = 1; l <= n; l++)
        {
            int r = (l == n ? 1 : l + 1);
            int tong = a[l] + a[r];
            if (tong > cur_max)
            {
                cur_max = tong;
                bestL = l;
                bestR = r;
            }
            else if (tong == cur_max && a[l] > a[bestL])
            {
                bestL = l;
                bestR = r;
            }
        }
    
        cout << a[bestL] << " " << a[bestR] << "\n";
        return 0;
    }
    
    

  • -1
    manhphuong20420140  đã bình luận lúc 28, Tháng 1, 2026, 9:37

    khoi cho


  • -1
    leminhkhoi4g0newton5  đã bình luận lúc 23, Tháng 1, 2026, 10:32

    code C

        #include <stdio.h>
    #include <limits.h>
    
    int main() {
        int n;
        scanf("%d", &n);
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
    
        // Khởi tạo max_sum bằng INT_MIN để xử lý số âm
        long long max_sum = LLONG_MIN;
        int idx1 = -1, idx2 = -1;
    
        // Duyệt các cặp lân cận thông thường (i và i+1)
    for (int i = 0; i < n - 1; i++) {
            long long current_sum = (long long)a[i] + a[i+1];
            if (current_sum > max_sum) {
                max_sum = current_sum;
                idx1 = i;
                idx2 = i+1;
            } else if (current_sum == max_sum) {
                // Nếu bằng nhau, chọn cặp có chỉ số đầu tiên lớn hơn
                if (i > idx1) {
                    idx1 = i;
                    idx2 = i+1;
                }
            }
        }
    
        // Xử lý cặp đặc biệt (cuối và đầu)
        long long wrap_sum = (long long)a[n-1] + a[0];
        if (wrap_sum > max_sum) {
            // Nếu cặp này lớn hơn tất cả, in ra theo quy tắc đặc biệt
            printf("%d %d", a[n-1], a[0]);
        } else if (wrap_sum == max_sum) {
            // Nếu bằng nhau, quy tắc đề bài nói "Nếu phần tử cuối cùng và phần tử đầu tiên là cặp có tổng lớn nhất, in phần tử     cuối cùng trước"
            // Điều này cho thấy cặp này luôn được ưu tiên in ra nếu nó thuộc nhóm tối ưu.
            printf("%d %d", a[n-1], a[0]);
        } else {
            // In cặp tìm được (đã xét điều kiện chỉ số lớn hơn khi duyệt)
            printf("%d %d", a[idx1], a[idx2]);
        }
    
        return 0;
    }
    

  • -1
    Liemaik2k11_3110  đã bình luận lúc 27, Tháng 12, 2025, 10:29 chỉnh sửa
    • ý tưởng là duyệt qua dãy 1.cho một biến s của a[i]+a[i+1] 2.nếu s>n thì cho hai biến nào đs nhận giá trị của a[i] và a[i+1]
    1. tiếp theo sẽ so sánh phần tử cuối cùng thì mn lm một biến nhận giá trị tổng của 2 phần tử cuối cùng và đầu tiên
    2. nếu biến tổng đs lớn hơn thì cho 2 biến ms nãy nhận giá trị của vị trí cuối cùng và đầu tiên
    3. rồi in 2 biến ra

  • -1
    minh6a3  đã bình luận lúc 13, Tháng 12, 2025, 7:53

    sos


  • -1
    nlon0679  đã bình luận lúc 13, Tháng 12, 2025, 3:25

    include <bits/stdc++.h>

    using namespace std;

    int main() { ios::syncwithstdio(false); cin.tie(nullptr);

    int n;
    cin >> n;
    
    vector&lt;long long> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    
    long long bestSum = LLONG_MIN;
    long long x = 0, y = 0;   // lưu cặp tốt nhất
    int bestPos = -1;         // lưu vị trí xuất hiện của phần tử thứ hai
    
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;  // phần tử liền sau, có vòng tròn
        long long sum = a[i] + a[j];
    
        if (sum > bestSum) {
            bestSum = sum;
            x = a[i];
            y = a[j];
            bestPos = j;
        }
        else if (sum == bestSum) {
            if (a[i] > x) {
                x = a[i];
                y = a[j];
                bestPos = j;
            }
            else if (a[i] == x && j < bestPos) {
                y = a[j];
                bestPos = j;
            }
        }
    }
    
    cout << x << " " << y;
    return 0;
    

    } code cho ae c++ nha


  • 4
    Duong_Thanh_Khiem_L8  đã bình luận lúc 7, Tháng 12, 2025, 2:51

    FULL AC cho ai cần:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
    
        vector&lt;long long> a(n);
        for (int i = 0; i < n; i++) cin >> a[i];
    
        long long bestSum = LLONG_MIN;
        long long x = 0, y = 0;   // lưu cặp tốt nhất
        int bestPos = -1;         // lưu vị trí xuất hiện của phần tử thứ hai
    
        for (int i = 0; i < n; i++) {
            int j = (i + 1) % n;  // phần tử liền sau, có vòng tròn
            long long sum = a[i] + a[j];
    
            if (sum > bestSum) {
                bestSum = sum;
                x = a[i];
                y = a[j];
                bestPos = j;
            }
            else if (sum == bestSum) {
                if (a[i] > x) {
                    x = a[i];
                    y = a[j];
                    bestPos = j;
                }
                else if (a[i] == x && j < bestPos) {
                    y = a[j];
                    bestPos = j;
                }
            }
        }
    
        cout << x << " " << y;
        return 0;
    }
    

  • 3
    quanghuy05  đã bình luận lúc 8, Tháng 8, 2025, 2:03 sửa 2

    bài này mình dùng 1 mảng lưu tổng, và 1 mảng lưu chỉ số của cặp phần tử trong tổng đó. tìm phần tử tổng lớn nhất và in ra cặp chỉ số tương ứng. Sample test cuối key là 2 6


  • 0
    nst2907  đã bình luận lúc 9, Tháng 6, 2025, 9:57

    dùng long long hả bn


  • -5
    phamtiensang2206  đã bình luận lúc 11, Tháng 12, 2024, 10:12

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -5
    plsdonate123  đã bình luận lúc 4, Tháng 11, 2024, 14:14

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -1
    super_god  đã bình luận lúc 8, Tháng 10, 2024, 2:49

    hello ae


  • 2
    Shmily16  đã bình luận lúc 2, Tháng 8, 2024, 22:45

    bài này test 2 sai đúng không nhỉ. đáp án phải là 2 6. submit 2 6 cũng AC còn 6 - 2 thì cook


  • -6
    thanhqt74  đã bình luận lúc 17, Tháng 12, 2023, 14:45

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.