Hướng dẫn giải của Cổng dịch chuyển

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Gợi ý

  • Vì ban đầu người chơi đứng ở phòng số ~0~ nên chi phí đi tới phòng đầu tiên sẽ cố định. Các phòng sau đó có thể chọn đi từ phòng ~0~ hoặc ~n+1~(dịch chuyển về phòng ~0~ hoặc ~n+1~ từ phòng trước đó).
  • Nếu phòng thứ ~i~ không được chọn đầu tiên thì chi phí để đi tới phòng ~i~ sẽ là ~min(i, n+1-i)~, tổng chi phí để sử dụng cổng dịch chuyển sẽ là ~min(i, n+1-i) + a_i~.
  • Ta chỉ việc chọn phòng đầu tiên mà người chơi đi đến(chi phí ~i+a_i~) và chọn các phòng với tổng chi phí nhỏ nhất cho đến khi hết xu.
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 2e5+5;

int n, c;
pair<int, int> a[N];
long long pref[N];
int ans = 0;

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

    for(int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        a[i] = {x+min(i, n+1-i), x+i};
    }

    sort(a+1, a+n+1);

    for(int i = 1; i <= n; i++)
    {
        pref[i] = pref[i-1]+a[i].first;
    }

    for(int i = 1; i <= n; i++)
    {
        int new_c = c-a[i].second;
        int l = 0, r = n;
        int mx = 0;
        while(l <= r)
        {
            int mid = (l + r) / 2;
            long long price = pref[mid];

            int res = mid+1;
            if(mid >= i)
            {
                price -= a[i].first;
                res--;
            }
            if(price <= new_c)
            {
                mx = max(res, mx);
                l = mid + 1;
            }
            else
            {
                r = mid - 1;
            }
        }
        ans = max(ans, mx);
    }
    cout << ans << endl;
    return 0;
}

Bình luận

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


Không có bình luận tại thời điểm này.

Hỗ Trợ CLAOJ
QR Code