Module: الگوها در برنامه نویسی پویا


Problem

5 /7


رستوران

Theory Click to read/hide

سلب مسئولیت: روشی که در زیر توضیح داده شده است جهانی نیست، اما اغلب می تواند یک مشکل را حل کند یا به شما کمک کند تا راه حل مناسب را پیدا کنید.

اگر مجموعه‌ای از شکاف‌ها روی یک محور (معمولاً محور زمانی یا شاخص‌های یک آرایه) قرار دارند و باید برخی از آنها را به‌طور بهینه انتخاب کنید تا شکاف‌های انتخاب‌شده با هم تلاقی نکنند، باید از برنامه‌نویسی پویا استفاده کنید. .

طرح حل تقریبی:

در ابتدا، شکاف های موجود را بر اساس حاشیه سمت راست مرتب می کنیم. بیایید دینامیک زیر را شروع کنیم: dp[i] - پاسخ اولین فواصل i. 
ما به صورت زیر دوباره محاسبه می کنیم: ابتدا وضعیتی را در نظر بگیرید که این بازه استفاده نمی شود، سپس فقط dp[i] = dp[i-1]. توجه داشته باشید که این تضمین می کند که مقادیر dp[i] با رشد i کاهش نمی یابد. و این منطقی است، زیرا. با اضافه کردن یک شکاف جدید، نمی‌توانیم پاسخ جهانی را بدتر کنیم: یا به سادگی شکاف جدید را نادیده می‌گیریم، یا با استفاده از آن یک نوع سودآورتر می‌سازیم. حال، اگر بخواهیم از شکاف i-ام استفاده کنیم، می‌توانیم از آن شکاف‌هایی استفاده کنیم که مرزهای سمت راست آن‌ها کمتر از مرز چپ شکاف فعلی است، زیرا باید مجموعه‌ای از شکاف‌های غیر همپوشانی را انتخاب کنیم. برای انجام این کار، ابتدا شکاف ها را بر اساس حاشیه سمت راست مرتب کردیم تا اکنون بتوانیم موقعیت مورد نیاز را به طور موثر پیدا کنیم. در صورت امکان می توان این کار را به صورت تحلیلی انجام داد، اما در حالت کلی می توان با جستجوی بینایی شکافی را یافت که مرز سمت راست آن کمتر از مرز سمت چپ فعلی و در عین حال حداکثر ممکن است. یکی ما می خواهیم مرز مناسب را به دلایل حریصانه به حداکثر برسانیم، زیرا همانطور که من رشد می کنم، پاسخ فقط می تواند افزایش یابد. بر این اساس، موقعیت p مورد نیاز را پیدا کرده و dp[i] را تا dp[p] و بازه i-ام دوباره محاسبه می‌کنیم.

Problem

رستوران n سفارش برای ضیافت دریافت کرد. هر سفارش با دو مقدار مشخص می شود: زمان شروع ضیافت li و زمان پایان ri (li ≤  r i).

مدیریت رستوران می تواند سفارش را بپذیرد یا آن را رد کند. حداکثر تعداد سفارشات قابل قبول چقدر است؟

هیچ دو سفارش پذیرفته شده نمی توانند با هم تلاقی کنند، یعنی نباید یک نقطه زمانی وجود داشته باشد که به دو سفارش پذیرفته شده در آن واحد تعلق داشته باشد. اگر یکی از سفارشات همزمان با پایان دیگر شروع شود، نمی توان آنها را با هم پذیرفت.

ورودی:
خط اول شامل یک عدد صحیح n (1 ≤ n ≤ 200000) — تعداد سفارشات هر یک از n خط بعدی شامل یک جفت اعداد صحیح li, ri (0 ≤ li  &le ; ri ≤ 109).

خروجی:
حداکثر تعداد سفارشات قابل قبول را چاپ کنید.

مثال:
  <بدن>
ورودی خروجی
2
7 11
4 7
1
5
1 2
23
34
4 5
5 6
3
6
48
15
47
25
1 3
68
2