- محدودیت زمان: ۱ ثانیه
- محدودیت حافظه: ۲۵۶ مگابایت
توضیحات اولیه پروژه
میخواهیم یک سامانه برای پیشنهاد موقعیت کار به کارجوها طراحی کنیم. این سامانه باید بتواند اطلاعات آنها را دریافت کند و برای هر کارجو مناسبترین کار را پیشنهاد دهد. همچنین این سیستم با توجه به بازدیدهایی که کارجوها از موقعیتهای کاری میکنند تغییر میکند.
تعدادی موقعیت کار داریم و هر موقعیت کار دارای ویژگیهای «نام موقعیت کار»، «بازهی سنی مورد نیاز این کار»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق پیشنهادی» و «مهارتهای مورد نیاز برای این موقعیت کاری» همچنین هر کارجو ویژگیهای «نام کارجو»، «سن کارجو»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق مورد انتظار کارجو» و «مهارتهای این کارجو» را دارد.
دستورها
به شما یک لیست از تمام مهارتهای موجود داده میشود و از شما میخواهیم تعدادی کوئری را پیادهسازی کنید:
فاز اول
اضافه کردن موقعیت کار (ADD-JOB
)
ADD-JOB
)ADD-JOB <NAME> <MINAGE> <MAXAGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
در این کوئری از شما خواسته میشود یک موقعیت کاری را به سامانه اضافه کنید. اطلاعاتی که در این کوئری داده میشود شامل نام موقعیت شغلی (<NAME>
)، محدودیت بازهی سنی کارجو (<MINAGE>
و <MAXAGE>
)، شرایط زمانی کار (یکی از سه حالت <FULLTIME|PARTTIME|PROJECT>
) و میزان حقوق ماهانه (<SALARY>
) است.
- رشتهی
<NAME>
باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد، در غیر این صورت خطایinvalid name
را چاپ کنید. - دو مقدار
<MINAGE>
و<MAXAGE>
باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشند. همچنین باید<MINAGE>
از<MAXAGE>
کمتر یا مساوی باشد، در غیر این صورت خطایinvalid age interval
را چاپ کنید. دقت کنید لزومی ندارد این مقادیر صحیح باشند. - شرایط زمانی باید دقیقاً یکی از سه کلمهی
FULLTIME
،PARTTIME
یاPROJECT
باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطایinvalid timetype
را چاپ کنید. - مقدار حقوق باید نامنفی و کمتر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام
invalid salary
را چاپ کنید. - اگر هیچکدام از خطاهای بالا پیش نیامد، پیام
job id is <idx>
را چاپ کنید و بهجای<idx>
شمارهی موقعیت کار را قرار دهید. برای شمارهگذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به موقعیتهای کاری که به این مرحله میرسند و با موفقیت ثبت میشوند، شماره نسبت دهید.
اضافه کردن کارجو (ADD-USER
)
ADD-USER
)ADD-USER <NAME> <AGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
در این کوئری شما باید یک کارجو را به سامانه بیفزایید. اطلاعات کارجو شامل نام (<NAME>
)، سن (<AGE>
)، شرایط زمانی کارجو برای کار (یکی از سه حالت <FULLTIME|PARTTIME|PROJECT>
) و حقوق درخواستی ماهانه (<SALARY>
) به شما داده میشود.
- رشتهی
<NAME>
باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد. در غیر این صورت خطایinvalid name
را چاپ کنید. - مقدار
<AGE>
باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشد، در غیر این صورت خطایinvalid age
را چاپ کنید. - شرایط زمانی باید دقیقاً یکی از سه کلمهی
FULLTIME
،PARTTIME
یاPROJECT
باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطایinvalid timetype
را چاپ کنید. - مقدار حقوق باید نامنفی و کمتر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام
invalid salary
را چاپ کنید. - اگر هیچ کدام از خطاهای بالا پیش نیامد، پیام
user id is <idx>
را چاپ کنید و بهجای<idx>
شمارهی کارجو را قرار دهید. برای شمارهگذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به کارجوهایی که به این مرحله میرسند و با موفقیت ثبت میشوند، شماره نسبت دهید.
اضافه کردن مهارت به موقعیت کاری (ADD-JOB-SKILL
)
ADD-JOB-SKILL
)ADD-JOB-SKILL <JOB-ID> <SKILL>
در این کوئری از شما خواسته میشود تا یک مهارت لازم را به یک کار موجود در لیست کارها اضافه نمایید. به موارد زیر توجه کنید:
- اگر موقعیت کاری با شمارهی
<JOB-ID>
وجود ندارد، خطایinvalid index
را چاپ کنید. تضمین میشودID
دادهشده، عددی صحیح باشد. - اگر مهارتی با نام
<SKILL>
در لیست اولیه وجود ندارد، خطایinvalid skill
را چاپ کنید. - اگر این مهارت قبلاً به این موقعیت کاری اضافه شده، پیام
repeated skill
را چاپ کنید. - اگر هیچکدام از خطاهای بالا رخ نداد، پیام
skill added
را چاپ کنید.
اضافه کردن مهارت به کارجو (ADD-USER-SKILL
)
ADD-USER-SKILL
)ADD-USER-SKILL <USER-ID> <SKILL>
در این کوئری از شما خواسته میشود تا یک مهارت را به مهارتهای کارجویی که از پیش ثبتنام کرده، اضافه نمایید. به موارد زیر توجه کنید:
- اگر کارجویی با شمارهی
<USER-ID>
وجود ندارد، خطایinvalid index
را چاپ کنید. تضمین میشود ID دادهشده، عددی صحیح باشد. - اگر مهارتی با نام
<SKILL>
در لیست اولیه وجود ندارد، خطایinvalid skill
را چاپ کنید. - اگر این مهارت قبلاً به این کاربر اضافه شده، پیام
repeated skill
را چاپ کنید. - اگر هیچکدام از خطاهای بالا رخ نداد، پیام
skill added
را چاپ کنید.
فاز دوم
گزارش مشاهده (VIEW
)
VIEW
)VIEW <USER-ID> <JOB-ID>
این دستور یعنی کارجو یک موقعیت کاری را مشاهده کرده است.
- اگر کارجویی با شمارهی
<USER-ID>
یا موقعیت کاری با شمارهی<JOB-ID>
وجود نداشت، خطایinvalid index
را چاپ کنید. تضمین میشود IDهای دادهشده، اعدادی صحیح باشد. - در صورتی که خطایی پیش نیامد، پیام
tracked
را چاپ کنید.
وضعیت موقعیت کار (JOB-STATUS
)
JOB-STATUS
)JOB-STATUS <JOB-ID>
- اگر موقعیت کاری با شمارهی
<JOB-ID>
وجود ندارد، خطایinvalid index
را چاپ کنید. تضمین میشودID
دادهشده، عددی صحیح باشد. - در غیر این صورت نام موقعیت کاری، سپس با یک
-
، مجموع تعدادview
هایی که این موقعیت کاری داشته و سپس یک-
و برای همهی مهارتهایی که در این موقعیت کاری هست در یک(,)
ابتدا نام مهارت و سپس تعدادview
هایی کارجوها با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید. اگر دو مهارت تعدادview
برابری داشت، در الویت دوم، برحسب رشتهی مهارت به صورت الفبایی مرتب کنید.
وضعیت کارجو (USER-STATUS
)
USER-STATUS
)USER-STATUS <USER-ID>
در این دستور، باید مهارتها را به ترتیب نشان دهید. دقت کنید ترتیب مهارتها، بر اساس مشاهدات کارجو تغییر میکند.
- اگر کارجویی با شمارهی
<USER-ID>
وجود ندارد، خطایinvalid index
را چاپ کنید. تضمین میشودID
دادهشده، عددی صحیح باشد. - در غیر این صورت نام کارجو، سپس با یک
-
و برای همهی مهارتهایی که در این کارجو هست در یک(,)
ابتدا نام مهارت و سپس تعدادview
هایی برای موقعیتهای کاری با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید. اگر دو مهارت تعدادview
برابری داشت، در الویت دوم، برحسب رشتهی مهارت به صورت الفبایی مرتب کنید.
فاز سوم
دریافت لیست کارها (GET-JOBLIST
)
GET-JOBLIST
)GET-JOBLIST <USER-ID>
- اگر کارجویی با شمارهی
<USER-ID>
وجود ندارد، خطایinvalid index
را چاپ کنید. تضمین میشودID
دادهشده، عددی صحیح باشد.
در این بخش باید مهارتهای مورد نیاز شغلها را با مهارتهای کارجو مقایسه کرده و طبق تابع داده شده در ادامه، امتیاز آنها را محاسبه کنید. سپس بر اساس امتیاز آنها را مرتب کرده و ۵ موقعیت شغلی برتر را با امتیازشان چاپ کنید.
متناسب بودن کارجو با موقعیت کار
امتیاز متناسب بودن یک کارجو و موقعیت کار از بخشهای زیر بهدست میآید.
امتیاز سن
اگر سن کارجو $x$ و بازهی سنی مورد نیاز موقعیت کار $[l, r]$ باشد، امتیاز برابر است با:
$$ \begin{cases} \min{r - x, x - l} & l \leq x \leq r \ x - l & x \lt l \ r - x & x \gt r \ \end{cases} $$
امتیاز مهارتها
اگر مجموعهی مهارتهای کارجو $A$ و مجموعهی مهارتهای مورد نیاز موقعیت کار $B$ باشد، امتیاز برابر است با: $$3 \times |A \cap B| - |B - A|$$
امتیاز وضعیت زمان
از روی این جدول امتیاز را تشخیص دهید:
. | FULLTIME |
PARTTIME |
PROJECT |
---|---|---|---|
FULLTIME |
۱۰ | ۵ | ۴ |
PARTTIME |
۵ | ۱۰ | ۵ |
PROJECT |
۴ | ۵ | ۱۰ |
امتیاز حقوق
اگر حقوق مورد انتظار کارجو $x$ و حقوق پیشنهادی موقعیت کار $y$ باشد، امتیاز این قسمت برابر است با:
$$\lfloor\frac{1000}{\max{|x - y|, 1}}\rfloor$$
اگر مجموع امتیازها چهار عدد قبل برابر $s$ شود، امتیاز هر کاربر $s \times 1000$ بهعلاوهی شمارهی موقعیت کاری است.
نکات
- همهی عبارتهای داخل
<>
یک رشته به طول حداقل ۱ و حداکثر ۱۰ از کاراکترهای رقم، حروف بزرگ و کوچک و.
است. - اگر چند خطا از خطاهای بالا پیش آمد، تنها خطایی را چاپ کنید که زودتر آمده است.
- تضمین میشود همهی مقادیر
<SALARY>
،<USER-ID>
،<JOB-ID>
،<AGE>
،<MINAGE>
و<MAXAGE>
همواره عدد صحیح داده میشود.
زیرمسئلهها
زیرمسئله | نمره | محدودیت |
---|---|---|
۱ | ۳۳ | فاز اول |
۲ | ۳۳ | فاز دوم |
۲ | ۳۴ | فاز سوم |
ورودی
در سطر اول ورودی، عدد صحیح و مثبت $s$ آمده است که تعداد مهارتها را نشان میدهد. $$1 \leq s \leq 100$$
در سطر دوم ورودی، یک لیست شامل $s$ رشته متمایز که با یک فاصله از هم جدا شدهاند آمده است که لیست مهارتها را نشان میدهد. در سطر سوم ورودی، عدد صحیح و مثبت $q$ آمده که تعداد درخواستهایی را که باید پوشش دهید، نشان میدهد.
$$1 \leq q \leq 1000$$
در $q$ سطر بعدی در هر سطر یک درخواست از انواعی که در صورت سوال آمده به شما داده میشود و شما باید کارهای مربوط به آن را انجام دهید.
خروجی
باید در هر سطر از خروجی، پیامهایی که توسط دستورها میآید را چاپ کنید.
مثالها
تست نمونه فاز ۱
ورودی نمونه ۱
3
codeing hacking talking
14
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 52000001
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEK.NET 10 110 PROJECT 30000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 ESHGHI 15000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 3 working
ADD-JOB-SKILL 3 talking
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 sleeping
خروجی نمونه ۱
user id is 1
invalid salary
job id is 1
invalid name
job id is 2
invalid timetype
user id is 2
invalid index
invalid index
skill added
skill added
skill added
repeated skill
invalid skill
- کارجویی به نام «
Amin
» با شمارهی ۱ اضافه میشود. - «
Hamed
» نمیتواند اضافه شود چون باید سه رقم سمت راست حقوقش ۰ باشد. - موقعیت کاری به نام «
Quera
» با شمارهی ۱ اضافه میشود. - «
YEK.NET
» حاوی کاراکتر.
است که برای نام قابل قبول نیست. - موقعیت کاری به نام «
YEKtaNET
» با شمارهی ۲ اضافه میشود. - شرایط زمانی به نام «
ESHGHI
» وجود ندارد. - کارجوی دیگری با نام «
Amin
» با شمارهی ۲ اضافه میشود. (نام تکراری مشکلی نیست.) - موقعیت کاری با شمارهی ۳ وجود ندارد. (حتی اگر مهارت درست نبود باید به شماره خطا بدهیم.)
- موقعیت کاری با شمارهی ۳ وجود ندارد.
- مهارت «
talking
» به شرکت شمارهی ۲ یعنی «YEKtaNET
» اضافه شد. - مهارت «
codeing
» به کارجوی شمارهی ۲ اضافه شد. - مهارت «
talking
» به کارجوی شمارهی ۱ اضافه شد. - مهارت تکراری نباید اضافه شود.
- مهارت داده شده باید در لیست اولیه مهارتها باشد.
تست نمونه فاز ۲
ورودی نمونه ۲
3
codeing hacking talking
27
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 3 1
VIEW 2 1
VIEW 2 4
VIEW 2 0
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
خروجی نمونه ۲
user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
Quera-0-
YEKtaNET-0-(talking,0)
invalid index
Amin-(talking,0)
Hamed-(codeing,0)
Amin-
tracked
tracked
tracked
tracked
tracked
invalid index
invalid index
Quera-4-
YEKtaNET-1-(talking,1)
invalid index
Amin-(talking,1)
Hamed-(codeing,0)
Amin-
- کارجویی به نام «
Amin
» با شمارهی ۱ اضافه میشود. - کارجویی به نام «
Hamed
» با شمارهی ۲ اضافه میشود. - موقعیت کاری به نام «
Quera
» با شمارهی ۱ اضافه میشود. - موقعیت کاری به نام «
YEKtaNET
» با شمارهی ۲ اضافه میشود. - کارجویی به نام «
Amin
» با شمارهی ۳ اضافه میشود. - مهارت «
talking
» به موقعیت کاری شمارهی ۲ اضافه میشود. - مهارت «
codeing
» به کارجوی شمارهی ۲ اضافه میشود. - مهارت «
talking
» به کارجوی شمارهی ۱ اضافه میشود. - چون «
Quera
» هیچ مشاهدهای ندارد، پس ۰ چاپ میشود و چون هیچ مهارتی ندارد خالی است. - چون «
YEKtaNET
» هیچ مشاهدهای ندارد، پس ۰ چاپ میشود و چون هیچ کارجویی با مهارت «talking
» این موقعیت کاری را ندیده، جلوی آن صفر چاپ میشود. - موقعیت کاری با شمارهی ۳ وجود ندارد.
- مهارتهای »
Amin
» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود. - مهارتهای »
Hamed
» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود. - کارجوی «
Amin
» مهارتی ندارد. - مشاهده ثبت میشود.
- مشاهده ثبت میشود.
- مشاهده ثبت میشود.
- مشاهده ثبت میشود.
- مشاهده ثبت میشود.
- موقعیت کاری با شمارهی ۴ وجود ندارد.
- موقعیت کاری با شمارهی ۰ وجود ندارد.
- موقعیت کاری «
Quera
» مجموعاً ۴ بار دیده شده است. - موقعیت کاری «
YEKtaNET
» یکبار دیده شده و یک نفر مهارت «talking
» را داشته است. - موقعیت کاری با شمارهی ۳ وجود ندارد.
- مهارتهای »
Amin
» و یک موقعیت کاری با مهارت آن دیده شده است. - مهارتهای »
Hamed
» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود. - کارجوی «
Amin
» مهارتی ندارد.
تست نمونه فاز ۳
ورودی نمونه ۳
3
codeing hacking talking
20
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 2 1
VIEW 3 1
VIEW 2 2
VIEW 1 1
VIEW 2 1
GET-JOBLIST 0
GET-JOBLIST 1
GET-JOBLIST 2
GET-JOBLIST 3
خروجی نمونه ۳
user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
tracked
tracked
tracked
tracked
tracked
tracked
tracked
tracked
invalid index
(2,51002)(1,43001)
(1,30001)(2,24002)
(2,19002)(1,19001)
ارسال پاسخ برای این سؤال