هر یک از فروشگاهها در دیجیکالاجت حوزه سرویسدهی محدودی دارند. در این سوال به شما حالت سادهای از نواحی سرویسدهی تعدادی از فروشگاههای دیجیکالا جت به صورت دو عدد طبیعی و داده میشود؛ به این معنا که تمام نواحی بین این دو عدد تحت پوشش آن فروشگاه است؛ دقت کنید که هر ناحیه با یک عدد طبیعی مشخص میشود. از طرف دیگر دو ناحیه آغازین و پایانی نیز به شما داده میشود. شما میبایست اگر تمامی نواحی از ناحیه
آغازین تا ناحیه پایانی تحت پوشش حداقل یکی از فروشگاههای داده شده باشد، مقدار true
و
در غیر اینصورت مقدار false
را بازگردانید. (به کوچک و بزرگ بودن حروف توجه کنید!)
یک ناحیه توسط یک فروشگاه، سرویسدهی میشود اگر باشد.
در خط اول ورودی، عدد طبیعی به عنوان تعداد فروشگاهها داده میشود.
در خط بعدی، در هر خط دو عدد صحیح که با یک فاصله از هم جدا شدهاند که نشاندهندهی شروع ناحیه تحت پوشش و پایان ناحیه تحت پوشش هر فروشگاه است، داده میشود.
در خط آخر دو، در هر سطر یک عدد صحیح آمده است که به ترتیب نشاندهندهی ناحیه آغازین و ناحیه پایانی است، داده میشود.
تنها خط خروجی باید شامل عبارت true
یا false
باشد که نشاندهنده آن است که آیا تمامی نواحی از ناحیه آغازین تا ناحیه پایانی تحت پوشش حداقل یکی از فروشگاههای داده شده هستند یا نه.
تمامی نواحی بین ۲ تا ۵ پوشش داده میشوند.
ناحیه ۲۱ توسط هیچکدام از فروشگاهها پوشش داده نمیشود.
دیجیکالا در پروموشن نوروز خودش یک تخفیف ویژه برای برنامهنویسان در نظر گرفته است. کاربران با وارد شدن به صفحهی این پروموشن، لیستی از کالاها و تخفیفهای عمومی را میبینند، اما دیجیکالا اعلام کرده است که هرکسی که بتواند به ازای هر سریالی که در این لیست هست، کوچیکترین سریال بزرگتر با کاراکترهای همون سریال را پیدا کند، میتواند یک تخفیف ۹۰٪ی روی تمام محصولات بگیرد. سریالهای کالاهای دیجیکالا رشتههایی از حروف انگلیسی a-z (همهی حروف کوچک) هستند و برای مقایسهی کوچیکتر/بزرگتر آنها از ترتیب حروف الفبا استفاده میشود. برای مثال کلمهی از کلمهی بزرگتر است و کلمهی از کلمهی کوچکتر است.
در خط اول ورودی که تعداد سریالهای پروموشون هست و در خط بعدی در هر خط به عنوان یک سریال داده میشوند.
خروجی شامل خط است که در هر خط در صورتی که رشتهی مورد نظر وجود دارد، رشته و در غیر این صورت عبارت no answer
چاپ میشود.
در این نمونه، ترکیب بعد از acs
برابر asc
است. تنها با جابجایی همین دو حرف کلمهی بعدی تشکیل میشود. در کلمهی lgeuvf
تنها با تبدیل uvf
به vfu
، رشتهی بعدی به دست میآید. در کلمهی zwsked
، چون حروف به صورت کاملا نزولی مرتب شدهاند، ترکیب کلمات در بزرگترین حالت خود قرار دارد.
مرکز سورتینگ دیجیکالا دارای مجموعهای از نقالهها برای سورت اتوماتیک بستهها است. هر کدام از این نقالهها از تعدادی استوانهی چرخنده یا رولر مجاور هم تشکیل شدهاند به نحوی که هر رولر میتواند یک بسته را به رولرهای سمت راست، چپ، جلو و عقب خود منتقل کند. توجه داشته باشید که ممکن است یک نقاله شامل یک تک رولر باشد. هر نقاله یک نقطهی شروع و یک نقطهی پایان دارد. هر دو رولر که از یک سمت با هم مجاور باشند، عضو یک نقاله هستند.
برای کنترل آلودگی صوتی مرکز سورتینگ تصمیم گرفته شد هر نقاله توسط یک و فقط یک کیوسک عایق صدا احاطه شود.
کیوسکها به صورت مکعب مستطیلهایی هستند که بر روی نقالهها قرار میگیرند و هزینهی هر کیوسک بر اساس مساحت سطح مقطع آن حساب میشود و مرکز سورتینگ تمایل دارد کمترین هزینه را برای خرید این کیوسکها داشته باشد.
شکل زیر نمای بالا از یکی از مراکز سورتینگ دیجیکالا است. خانههای آبی رنگ نشاندهندهی رولرهای نقالهها و خطهای قرمز نشاندهندهی محیط کیوسکهای قرار گرفته در اطراف هر نقاله است.
الگوریتمی طراحی کنید که با داشتن محل رولرها، مساحت بزرگترین کیوسک لازم را محاسبه کند.
در خط اول طول و عرض مرکز سورتینگ و تعداد نقالهها داده میشوند.
در خط بعدی هر خط شمارهی ردیف در سورتینگ سنتر و شمارهی ستون آغاز و شمارهی ستون پایان یک بخش از نقاله داده میشوند.
مساحت بزرگترین کیوسک
در این نمونه، ورودی و خروجی کاملا مطابق با تصویر صورت سوال است. همانطور که در تصویر مشخص است، بزرگترین مساحت کیوسک برابر ۱۲ است.
این نمونه مطابق با تصویر زیر است:
حسنی به تازگی در دیجیکالا به عنوان مهندس نرمافزار استخدام شده است و وظیفهی بهینه کردن حملونقل بین مرکز پردازش و مراکز توزیع را دارد. هر بسته برای آن که به مشتری برسد در ابتدا در مرکز پردازش آماده میشود و سپس به یکی از مراکز توزیع دیجیکالا فرستاده شده و از آنجا برای مشتری ارسال میگردد.
در فرایند ارسال مرسولهها از مرکز پردازش به مرکز توزیع به هر راننده تعدادی مرسوله واگذار میشود که وظیفهی تحویل این مرسولهها را دارد. هر مرسوله وزن مشخصی دارد و باید به مرکز توزیع مشخصی فرستاده شود. این دو مقدار را با متغیر های و مشخص میکنیم.
وسایل نقلیه رانندهها دو محدودیت حداکثر تعداد مرسوله قابل حمل و حداکثر وزن قابل حمل را دارد. این دو محدودیت را با متغیرهای و مشخص میکنیم.
مرسولهها به تریتب تاریخ تحویل به مشتری، به راننده تحویل داده میشوند و راننده نیز باید به همان ترتیب بستهها را به مراکز توزیع تحویل دهد. راننده نمیتواند ترتیب مرسولهها را به هم زده و به ترتیب دلخواه مرسولهها را تحویل دهد.
فرآیند تحویل مرسولهها به این صورت است که راننده پس از اتخاب تعدادی مرسوله، از مرکز پردازش حرکت کرده و به ترتیب مرسولهها به مراکز توزیع مراجعه کرده و مرسولهها را تحویل میدهد. پس از اتمام مرسولههای در دست به مرکز پردازش بازمیگردد و تعداد دیگری از مرسولهها را انتخاب میکند. این فرآیند تا زمانی که هیچ مرسولهای باقی نماند ادامه پیدا میکند. پس از اتمام تمامی مرسولهها راننده به مرکز پردازش باز میگردد.
حال وظیفه حسنی برنامه ریزی کردن حمل و نقل رانندهها جهت حداقل کردن تعداد سفرهای راننده است. به حسنی کمک کنید که با داشتن مرسولههای مربوط به یک راننده، تعداد حداقل سفرهای لازم راننده را حساب کرده و به اون نشان دهد.
در خط اول ۴ عدد صحیح ، ، و داده میشود که به ترتیب نمایانگر تعداد مراکز توزیع، تعداد مرسولهها، حداکثر ظرفیت تعدادی و حداکثر ظرفیت حجمی راننده است.
در خط بعدی دو عدد صحیح و داده میشود که به ترتیب نشان دهنده شماره مرکز توزیع و وزن مرسوله است.
در خروجی حداقل تعداد سفر لازم برای رساندن تمامی مرسولهها را چاپ کنید.
حداقل تعداد سفرهای لازم به این گونه است که راننده تمامی مرسولهها را برداشته و به مرکز توزیع اول میرود (سفر اول) و مرسوله اول را تحویل میدهد. سپس به مرکز توزیع دوم رفته (سفر دوم) و مرسوله دوم را تحویل میدهد. در انتها نیز به مرکز توزیع اول بازگشته (سفر سوم) و مرسوله سوم را تحویل داده و به مرکز توزیع باز میگردد (سفر چهارم).
حداقل تعداد سفرهای لازم به این گونه است که راننده اولین مرسوله را برداشته، به مرکز توزیع اول تحویل داده و به مرکز پردازش بازمیگردد (۲ سفر). سپس مرسوله دو، سه و چهار را برداشته و به مرکز توزیع سوم برده و پس از تحویل مرسوله ها بازمیگردد (۲ سفر). در نهایت مرسوله پنجم را برداشته و به مرکز توزیع شماره دو رفته و پس از تحویل مرسوله باز میگردد (۲ سفر).
حداقل تعداد سفرهای لازم به این گونه است که راننده مرسوله اول و دوم را برمیدارد و به مرکز توزیع شماره ۱ میرود و پس از تحویل مرسولهها به مرکز پردازش باز میگردد (۲ سفر). سپس مرسولههای سوم و چهارم را برمیدارد و به مرکز توزیع شماره ۲ میرود و پس از تحویل مرسوله به مرکز پردازش باز می گردد (۲ سفر). در نهایت مرسوله پنجم و ششم را برمیدارد و به مرکز توزیع شماره ۳ رفته و پس از تحویل مرسولهها به مرکز پردازش باز میگردد (۲ سفر).
تیم مارکتینگ دیجیکالا میخواهد در روز یلدا کمپینی را برگزار کند که در آن آیتم را برای فروش ویژه قرار بدهد و به نفر اولی که از این آیتمها خریداری کنند علاوه بر آیتمی که خریدهاند، یک آیتم هدیه نیز تحویل بدهد. آیتم ها از تا شمارهگذاری شدهاند و هر شخص فقط میتواند یک کالا را از این لیست برای خود بخرد.
شما شخصی هستید که قرار است یک لیست از آیتم خریداری شده تحویل بگیرید و جفتآیتم تحویل دهید به طوری که به هر شخص خریدار آیتمی که سفارش داده به علاوه یک آیتم هدیه تعلق گیرد.
حال دوستان شما چالشی برای شما مطرح میکنند که برای فهم آن ابتدا نیاز به یک تعریف دارید.
عدد خاص را اینگونه تعریف میکنیم: تعداد جفتآیتمهایی که در آنها شمارهی آیتم کاربر کمتر از شمارهی آیتم هدیه باشد. حال چالش شما این است که بعد از گرفتن لیست آیتم خریداریشده بگویید چند عدد خاص مختلف میتوانید بسازید.
خط اول شامل عدد است که تعداد کمپینها را نشان میدهد.
خط اول هر کمپین عدد به عنوان تعداد سفارشات در کمپین به شما داده میشود.
خط دوم هر کمپین عدد مرتبشده از کوچک به بزرگ داده میشود. لازم به ذکر است جمع تمامی ها از بیشتر نمیشود.
برای هر کمپین «تعداد» اعداد خاصی که میتوانید بسازید را چاپ کنید.
در کمپین نخست این مثال، جمعا دو کالا موجود داریم (چون تعداد کالاها برابر است). بنابراین تنها یک راه وجود دارد، آن هم اینکه به تنها کاربری که خرید کرده است، کالای شمارهی ۲ هدیه داده شود.
در کمپین دوم، سه حالت وجود دارد. عدد خاص برابر با ۲ باشد (برای مثال به ترتیب کالاهای ۲ و ۳ و ۶ و ۷ و ۸ به خریداران هدیه داده شوند)؛ یا میتواند برابر با ۳ باشد (به ترتیب کالاهای ۲ و ۶ و ۷ و ۳ و ۸ هدیه داده شوند)؛ یا میتواند برابر ۱ باشد (به ترتیب کالاهای ۸ و ۲ و ۳ و ۶ و ۷ هدیه داده شوند).
در کمپین سوم این مثال، در هر حال در هر جفتآیتمی که ایجاد کنیم شمارهی هدیه کمتر از شمارهی کالای خریداریشده است، بنابراین تنها عدد ۰ را داریم.
اخیرا بین ۳ تیم مختلف هوش مصنوعی، هوش تجاری و مهندسی در دیجیکالا رقابتی شکل گرفته تا بفهمند کدام تیم در کار با اعداد سریعتر است. نحوه ی رقابت به این صورت است که یک جدول بزرگ که شامل اعداد زیادی است را در نظر میگیریم و تمام اعداد آن جدول را با هم جمع میکنند و عددی به دست میآورند که میتواند بسیار بزرگ باشد و آن را مینامیم. مرحلهی بعد این رقابت این است که از زیررشتهای متوالی را حذف میکنیم و به عددی جدید میرسیم. (عدد جدید میتواند با تعدادی صفر شروع شود) همچنین اگر تمام ارقام را حذف کنید عدد باقی مانده صفر میشود.
حال چالش این است که جمع تمامی اعداد بدست آمده بعد از یک مرحله حذف کردن ارقام را بیابید. از آنجا که این عدد ممکن است خیلی بزرگ شود باقی مانده آن به را بیابید. عجله کنید و به تیم خود در برنده شدن کمک کنید!
در تنها خط ورودی عدد به شما داده میشود.
در تنها خط خروجی باقیماندهی مجموع خواستهشده را به چاپ کنید.
در این مثال هربار یکی از زیررشتههای ۲، ۲۰، ۰، ۰۴، ۴ حذف میشوند و هربار عددی را که باقی میماند جمع میکنیم.
دیجیکالا انبارهای متفاوتی دارد و از طرفی خود فروشندگان هم میتوانند انبارهای خود را داشته باشند، اما یک انبار اصلی وجود دارد که به آن انبار دانش میگوییم. میان برخی از این انبارها جادههایی وجود دارد که هزینهی عبور از این جادهها مشخص است. دیجیکالا برای جابهجایی کالاها میان انبارها با شرکتی به نام «ترانزیت برادران سلطانلو به جز سلطان کوچیکه» قرارداد بسته و آنها به ازای هر جابهجایی هزینهای از دیجیکالا دریافت میکنند. اما این شرکت قانون عجیبی برای جابهجایی دارد. این قانون از این قرار است که در هر حرکت باید از ۲ جاده عبور کرد مثلا برای جابهجایی از انبار به انبار ، ابتدا باید از انبار به انبار و سپس از انبار به انبار حرکت کرد و در نهایت هزینهای که بابت این مسیر، دریافت میکند برابر مربع مجموع هزینهی هرکدام از مسیرهاست، یا به عبارتی:
طبق این تعریف، ممکن است بین دو انبار هیچ مسیری وجود نداشته باشد! چون هر مسیر شامل تعدادی حرکت است (که هر حرکت دقیقا شامل ۲ جاده است) و مجموع هزینهی این حرکتها برابر است با هزینهای که شرکت باید به برادران سلطانلو بپردازد.
حال از شما خواسته میشود که کمترین هزینهی جابهجایی از انبار اصلی دانش(انبار ۱) به باقی انبارها را بیابید. توجه داشته باشید که ممکن است نتوانید مسیری میان انبار اصلی و برخی از انبارها بیابید. در آن صورت این هزینه را ۱- برگردانید.
در خط اول ۲ عدد و آمده است که به ترتیب تعداد انبارها و تعداد راههاست. میان هر ۲ انبار حداکثر یک راه داریم و انباری به خودش راهی ندارد. در خط بعدی در هر خط به ترتیب سه عدد و و آمده که نشان دهندهی راهی دوطرفه بین و است که هزینهی آن است. تضمین میشود هر راه حداکثر یکبار ورودی داده میشود.
در تنها خط خروجی به ازای انبار اگر مسیری درست برای جابهجایی (با توجه به شروط گفته شده) از انبار یک به انبار وجود نداشت عدد ۱- و اگر وجود داشت کم ترین هزینهی ممکن برای جابهجایی از انبار ۱ به انبار را چاپ کنید. دقت کنید فاصلهی هر انبار از خودش برابر صفر میباشد.
در این مثال، مسیری درست برای رسیدن از ۱ به ۲ وجود ندارد و عدد ۱- برمیگردد. برای رسیدن از انبار ۱ به انبار ۳ کافیست جادههای انبار ۱ به انبار ۲ و انبار ۲ به انبار ۳ طی شوند و جمع هزینه آنها برابر مربع مجموع ۴ و ۲ یعنی ۳۶ است.
کد شما باید روی نسخهی استاندارد MySQL قابل اجرا باشد.
جدولی با نام orders
برای نگهداری اطلاعات سفارشها موجود است که ساختار آن بهشرح زیر است:
نام | نوع | تعریف | ملاحضات |
---|---|---|---|
id | int | شناسهی سفارش | primary key |
customer_id | int | شناسهی مشتری | foreign key customers |
status | enum | وضعیت سفارش که یکی از حالات در انتظار پرداخت، در انبار، کنسلشده و تحویلدادهشده است | یکی از مقادیر wait_payment، warehouse، canceled و sent میباشد |
created_at | date | تاریخ ثبت سفارش |
همچنین جدولی با نام customers
برای نگهداری اطلاعات کاربران با ساختار زیر داریم:
نام | نوع | تعریف | ملاحظات |
---|---|---|---|
id | int | شناسهی مشتری | primary key |
name | varchar | نام مشتری | |
is_blocked | bool | آیا فعالیت مشتری در سایت ممنوع شده است؟ | Nullable، مقدار ۱ برای مشتریهای بلاکشده است و مقدار صفر یا null برای مشتری عادی است |
کوئریهای SQL خواستهشده از شما موارد زیر است (هر کوئری نمرهای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بزنید، کوئریهایی که حل کردید را بفرستید و قسمت آن کوئری را خالی بگذارید):
بخش ۱) کوئریای بنویسید که لیست تمامی سفارشاتی که در انبار هستند را برگرداند. خروجی باید شامل یک جدول با یک ستون order_id
باشد که بهترتیب شناسهی سفارش و بهصورت نزولی مرتب شدهاند.
بخش ۲) کوئریای بنویسید که شناسه و نام تمامی مشتریانی که تا به حال سفارشی ثبت نکردهاند را برگرداند. خروجی باید شامل دو ستون با نامهای customer_id
و customer_name
باشد که بهترتیبِ نام مشتری و بهصورت صعودی مرتب شدهاند.
بخش ۳) نرخ سفارشات کنسلشده برابر است با تعداد تمامی سفارشات کنسلشده برای مشتریان عادی (بلاکنشده) تقسیم بر تعداد سفارشات برای مشتریان عادی. کوئریای بنویسید که نرخ کنسل شدن را در هر روز تا دو رقم اعشار محاسبه کند. خروجی باید شامل یک جدول با دو ستون با نامهای date
و cancellation_rate
باشد. توجه کنید که در جدول خروجی تنها باید شامل تاریخهایی که در آنها سفارش ثبت شده است باشد. برای نمایش نرخ سفارشات باید عدد محاسبهشده را در ۱۰۰ ضرب کرده و با استفاده از تابع format
تا دو رقم اعشار آن را گرد کنید تا بهصورت درصد قابل نمایش باشد.
کد خود را در قالب زیر، در یک فایل با نام code.sql
قرار دهید و آن را ارسال کنید: