VOI 08 Bài 1 - Trò chơi với dãy số

Xem dạng PDF

Gửi bài giải


Điểm: 0,07 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Nguồn bài:
VOI 2008
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây. Mỗi bạn chọn trước một dãy số gồm ~n~ số nguyên. Giả sử dãy số mà bạn thứ nhất chọn là:

~b_1, b_2, \dots, b_n~

còn dãy số mà bạn thứ hai chọn là:

~c_1, c_2, \dots, c_n~

Mỗi lượt chơi mỗi bạn đưa ra một số hạng trong dãy số của mình. Nếu bạn thứ nhất đưa ra số hạng ~b_{i}~ ~(1 \leq i \leq n)~, còn bạn thứ hai đưa ra số hạng ~c_{j}~ ~(1 \leq j \leq n)~ thì giá của lượt chơi đó sẽ là ~|b_{i} + c_{j}|~.

Ví dụ: Giả sử dãy số bạn thứ nhất chọn là 1, -2; còn dãy số mà bạn thứ hai chọn là 2, 3. Khi đó các khả năng có thể của một lượt chơi là (1, 2), (1, 3), (-2, 2), (-2, 3). Như vậy, giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể là 0 tương ứng với giá của lượt chơi (-2, 2).

Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể.

Input

  • Dòng đầu tiên chứa số nguyên dương ~n~ ~(n \leq 10^{5})~
  • Dòng thứ hai chứa dãy số nguyên ~b_1, b_2, \dots, b_n~ ~(|b_{i}| \leq 10^{9}, i = 1, 2, ..., n)~
  • Dòng thứ ba chứa dãy số nguyên ~c_1, c_2, \dots, c_n~ ~(|c_{i}| \leq 10^{9}, i = 1, 2, ..., n)~

Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách.

Output

Ghi ra giá nhỏ nhất tìm được.

Giới hạn

  • 60% số tests ứng với 60% số điểm của bài có ~(1 \leq n \leq 1000)~.

Sample Input

2
1 -2
2 3

Sample Output

0

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • -4
    ngoccaidu2008  đã bình luận lúc 29, Tháng 10, 2025, 14:36

    Bài cũng khá cơ bản:

    code tham khảo:

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    #define __Hormer_Nguyen__ signed main()
    #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
    const int maxn=5+1e5;
    int n,ans=LLONG_MAX;
    int a[maxn],b[maxn];
    __Hormer_Nguyen__
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n;
        for (int i=1;i<=n;i++)
            cin>>a[i];
        for (int i=1;i<=n;i++)
            cin>>b[i];
        sort(a+1,a+n+1);
        sort(b+1,b+n+1);
        for (int i=1;i<=n;i++)
        {
            auto k=lower_bound(b+1,b+n+1,-a[i]);
            if (k==b+n+1) ans=min(ans,abs(a[i]+b[n]));
            else if (k!=b+1) ans=min(ans,min(abs(a[i]+b[k-b]),abs(a[i]+b[k-b-1])));
            else ans=min(ans,abs(a[i]+b[1]));
        }cout<<ans;
    }
    

  • -7
    dothupcb  đã bình luận lúc 16, Tháng 10, 2025, 15:02

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


  • 6
    NguyenQuyK58A  đã bình luận lúc 12, Tháng 9, 2025, 14:05

    Bạn nào bị sai 1 test thì dùng long long nha


  • 2
    thaihsgserk60  đã bình luận lúc 20, Tháng 8, 2025, 14:26

    include <bits/stdc++.h>

    using namespace std; int main(){ int n;cin >>n; int a[n]; int b[n]; for(int i=0;i<n;i++) cin >>a[i]; for(int j=0;j<n;j++) cin >>b[j]; sort(b,b+n); int MIN=1e9; for(int i=0;i<n;i++){ auto it=lower_bound(b,b+n,-a[i]); if(it!=b+n){ MIN=min(MIN,abs(it+a[i])); } if(it!=b){ it-=1; MIN=min(MIN,abs(it+a[i])); } } cout <<MIN<<'\n'; return 0; } an 14/15 test sai o dau a


  • -9
    THPTHD_Hieu  đã bình luận lúc 13, Tháng 5, 2025, 8:10

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


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

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


      • -9
        phunguyengia0809  đã bình luận lúc 23, Tháng 7, 2025, 4:20

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


  • -18
    truonghovuviet  đã bình luận lúc 19, Tháng 12, 2024, 14:23 sửa 3

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


  • -11
    leminhhoang16112012  đã bình luận lúc 8, Tháng 12, 2024, 15:36

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


  • 5
    quanbao29060  đã bình luận lúc 20, Tháng 11, 2024, 15:41

    Hướng giải của mình thì các bạn sort thằng a sau đó với mỗi b tìm tổng nhỏ nhất bằng lower_bound. Mình chỉ gợi ý thế thôi mn tham khảo.


  • 125
    PDNAM  đã bình luận lúc 5, Tháng 9, 2023, 4:28 sửa 2

    Đây là hướng giải của mình bằng c++,thấy hay cho xin ^ nha:

    ta thấy đối với b[i] thì |b[i]+c[j]| bé nhất là khi c[j] là phần tử bé nhất trong mảng c mà => -(b[i]) hoặc số lớn nhất trong mảng c mà < -(b[i])

    vậy nên ta chỉ cần sort b và c ,rồi tìm giá trị |b[i]+c[j]| bằng hai con trỏ vì với mọi c[j]lớn hơn b[i] thì cũng sẽ lớn hơn b[i-1]

    đặt j=n rồi for(i=n->1){ tìm c[j]đầu tiên mà <=b[i];tính kết quả = max của kết quả và max(abs(b[i]-c[j],abs(b[i]-c[j+1]) } nếu kết quả =0 thì break;

    cuối cùng là in ra kết quả


    • -27
      DTAN  đã bình luận lúc 10, Tháng 10, 2023, 6:06

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


      • -23
        PDNAM  đã bình luận lúc 10, Tháng 10, 2023, 12:02

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


  • -6
    PDNAM  đã bình luận lúc 17, Tháng 8, 2023, 3:02 chỉnh sửa

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


  • -41
    chonnhan123  đã bình luận lúc 16, Tháng 3, 2023, 13:21 sửa 4

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


    • -37
      hthai  đã bình luận lúc 14, Tháng 8, 2023, 16:20

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


  • -82
    Dannyplusplus  đã bình luận lúc 24, Tháng 9, 2022, 13:49

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


  • -97
    minhphannq  đã bình luận lúc 17, Tháng 9, 2022, 5:57

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