گلابی، یک مدیر فنی منظم و علاقهمند به بهینهسازی مدیریت تسکهاست. او همواره به دنبال روشهایی است تا کارها را به شکل بهتر سازماندهی کند و زمان تیمش را به صورت موثرتری مدیریت نماید.
برای مقایسه پیچیدگی تسکها، از واحدی به نام «استوری پوینت» استفاده میشود. هرچه استوری پوینت یک تسک بیشتر باشد، آن تسک پیچیدهتر یا پرریسکتر خواهد بود.
برای سادهتر شدن تخمین تعداد استوری پوینتهای یک تسک فنی، معمولاً از اعداد دنباله فیبوناچی استفاده میشود. این دنباله با اعداد ۱ و ۲ شروع شده و هر عدد برابر مجموع دو عدد قبلی است. به این ترتیب دنباله به صورت ۱، ۲، ۳، ۵، ۸، ۱۳، ۲۱ و... ادامه مییابد. استفاده از این دنباله به دلیل افزایش تدریجی و منطقی آن، در تخمین پیچیدگی تسکها بسیار کارآمد است.
گلابی در جلسات برنامهریزی تیم فنی، درباره تعداد استوری پوینت هر تسک تصمیمگیری میکند. او میداند که برای برگزاری یک مسابقه برنامهنویسی، استوری پوینت نیاز است و هدفش این است که این مقدار را به کمترین تعداد تسک ممکن تقسیم کند، به طوری که تعداد استوری پوینت هر تسک یکی از اعداد دنباله فیبوناچی باشد. گلابی امیدوار است با این روش برنامهریزی سادهتر و کارآمدتری انجام دهد.
در تنها خط ورودی، عدد صحیح داده میشود که تعداد استوری پوینتهای مورد نیاز برای مسابقه برنامهنویسی را مشخص میکند.
در تنها خط خروجی، کمترین تعداد تسکهای ممکن را چاپ کنید.
عدد در دنباله فیبوناچی نیست، اما میتوان آن را به دو تسک و تقسیم کرد که هر دو جزو دنباله فیبوناچی هستند.
عدد را میتوان به سه تسک ، و تقسیم کرد که همگی در دنباله فیبوناچی قرار دارند.
نیازی نیست چک کنید شرایط گفته شده در ورودی برقرار است یا نه. توضیحات محدودیتها فقط برای آگاهی شما دربارهی تستها و محدودیتهای مسئله است و قطعاً در ورودیهای داده شده به برنامهی شما رعایت میشوند. پس نیازی نیست بنویسید:
شما میتوانید لابهلای دریافت ورودی، خروجی دهید. پس نیازی نیست ابتدا همهی ورودیها را دریافت کنید و در نهایت همهی خروجیها را چاپ کنید. مخصوصاً برای سوالاتی که باید به چندین سوال پاسخ دهید، میتوانید دو قسمت ورودی و خروجی را کاملاً مستقل در نظر بگیرید و مطمئن باشید تداخلی پیش نمیآید.
لطفاً از چاپ کردن موارد اضافه مثل please enter a number
برای دریافت ورودی پرهیز کنید. برای مثال در زبان پایتون نباید بنویسید:
برای زبانهایی مثل جاوا نباید در بالای کد شما آدرس پکیج داده شود. برای مثال در بالای کد خود نباید بنویسید:
Scanner
برای دریافت ورودی
در زبان جاوا، باید فقط یک شئ از جنس Scanner
تعریف کنید و همهی ورودیها را با آن دریافت کنید.
در زبان جاوا، باید نام فایل ارسالی شما با نام کلاسی که تابع main
در آن قرار دارد یکسان باشد، برای مثال اگر نام کلاس شما Question1
است، نام فایل ارسالی شما باید Question1.java
باشد.
برای آشنایی بیشتر برای نحوهی دریافت ورودی و چاپ کردن خروجی این لینک را مطالعه کنید.
در شهر شکرستان بانک وجود دارد. هر روز تعدادی تراکنش مالی میان بانکها باید اتفاق بیافتد. گلابی که رئیس بانک مرکزی شکرستان است متوجه شده که مجموع تراکنشهای بین بانکها امکان دارد خیلی زیاد باشد برای همین دنبال کم کردن مجموع مبلغ آنها است.
او تراکنشهای مالی میان بانکها در هر روز را میبیند و سعی میکند با کمترین مجموع مبلغ تراکنش، تراکنش مالی میان بانکها را انجام بدهد.
به او کمک کنید که این کار را انجام دهد طوری که شرایط بالا رعایت شود. توجه کنید نیازی نیست تعداد تراکنشها کمینه شود بلکه باید مجموع مبلغ کل تراکنشها کمینه باشد.
در خط اول به ترتیب دو عدد و ورودی داده میشود که تعداد بانکهای شهر شکرستان است و تعداد تراکنشهای مالی میان بانکها در آن روز است.
در خط بعد در هر خط به ترتیب سه عدد و و داده میشود که نشان دهندهی این است که در این تراکنش همت (هزار میلیارد تومان) از بانک به بانک باید انتقال داده شود.
در خط اول ورودی عدد که تعداد تراکنش برای انجام تراکنشهای مالی میان بانکها است را خروجی دهید.
سپس در هرکدام از خط بعدی به ترتیب سه عدد و و را خروجی دهید. که نشان دهندهی این هستند که در این تراکنش همت (هزار میلیارد تومان) از بانک به بانک انتقال داده میشود.
اگر چند روش برای انجام تراکنشها وجود دارد، یکی را به دلخواه چاپ کنید.
یک رشتهی باینری به نام داریم که فقط شامل کاراکترهای 0
و 1
است. هدف این است که به پرسش درباره این رشته پاسخ دهیم.
پرسشها به دو نوع تقسیم میشوند:
0
به 1
و 1
به 0
تبدیل شود).در سطر اول ورودی، دو عدد صحیح و مثبت و داده میشود که بهترتیب طول رشتهی و تعداد پرسشها را نشان میدهد.
در سطر دوم ورودی، یک رشته از کاراکتر 0
یا 1
داده میشود که مقدار رشتهی را نشان میدهد.
در سطر بعدی، در هر سطر یکی از دو حالت زیر ورودی داده میشود.
که بهجای رشتهی باینری داده میشود.
که بهجای یک عدد صحیح داده میشود.
تضمین میشود حداقل یک پرسش از نوع اول داده شود.
برای هر پرسش از نوع در صورت وجود رشتهی داده شده YES
و در غیر این صورت NO
چاپ کنید.
توجه کنید سیستم داوری نسبت به بزرگ و کوچک بودن حروف حساس است.
دو کلمهی و بهصورت رشته داده شده است. زیرکلمه به معنای رشتهای است که از حذف تعدادی (شاید هیچ) حرف از یک کلمه بهدست میآید. بهعنوان مثال، از کلمهی behpardakht
میتوان زیرکلمات bera
یا hard
را بهعنوان زیرکلمه در نظر گرفت ولیpardeh
زیرکلمهی آن نیست.
یک کلمه آینهای است اگر با برعکس کردن حروف آن، همان کلمهی اولیه بهدست آید. بهعنوان مثال، کلمات level
از نوع کلمات آینهای هستند.
هدف ما این است که تعیین کنیم آیا با تغییر حداکثر حرف در کلمات و یا ، میتوان طول بزرگترین زیرکلمهی مشترک بین و که آینهای باشد را پیدا کرد. به عبارت دیگر، میخواهیم طول بیشینهی زیرکلمهای که هم در و هم در بهعنوان زیررشته غیرمتوالی وجود داشته باشد و همچنین آینهای باشد را تعیین کنیم، به شرطی که بتوانیم حداکثر حرف از هر دو کلمه را تغییر دهیم.
در سطر اول ورودی، عدد صحیح و مثبت آمده که تعداد تغییرات را نشان میدهد.
در سطر دوم ورودی، رشتهی از حروف کوچک انگلیسی داده میشود. در سطر سوم ورودی، رشتهی از حروف کوچک انگلیسی داده میشود.
در تنها سطر خروجی، طول بزرگترین زیررشتهی مشترک آینهای را چاپ کنید.
میتوانیم با تغییر رشته quera
را به aurra
تبدیل کنیم. همچنین با تغییر میتوانیم رشته behpardakht
را به behparrakht
تغییر دهیم. به این ترتیب در مجموع تغییر انجام دادیم و بزرگترین زیررشتهی پالیندروم مشترک arra
میشود.
میتوانیم با تغییر رشته sicilian
را به sicilias
تبدیل کنیم. بزرگترین زیررشتهی پالیندروم مشترک siiis
میشود.
شما باید یک سیستم شبیهسازی خودپرداز (ATM) طراحی کنید که بتواند تراکنشهای مالی شامل ثبتنام کاربر، ورود به سیستم، برداشت، واریز و انتقال وجه [و استعلام موجودی] را پردازش کند. علاوه بر آن، سیستم باید قادر به مدیریت و ثبت گزارش و لاگهای مختلف باشد و امکان کوئری زدن روی این لاگها را فراهم کند.
در این سیستم، هر لاگ سه ویژگی سطح لاگ (level
)، پیام (message
) و زمان ایجاد (timestamp
) دارد.
همچنین سه سطح لاگ قابل ثبت است. هرکدام از این نوع لاگها، در شرایطی قابل ثبت هستند و کاربردهای متفاوتی دارند.
لاگ ERROR
(خطا):
insufficient funds
یا invalid credentials
.لاگ INFO
(اطلاعات):
login
یا deposit
.لاگ DEBUG
(دیباگ):
session created
یا amount updated
.نشست (Session) در برنامههای کاربردی، بهویژه در سیستمهای تحت وب به دورهای از ارتباط فعال بین کاربر و سیستم گفته میشود که در آن اطلاعاتی موقت ذخیره و مدیریت میشود. نشستها معمولاً برای شناسایی کاربران، حفظ وضعیت تعامل آنها با سیستم، و مدیریت امنیت به کار میروند. هر نشست در این سیستم ویژگیهای زیر را دارد:
شناسه یکتا (Session ID
):
Session ID
بهصورت یک شمارنده افزایشی (شروع از ۱) تولید میشود.مدت اعتبار (Expiration
):
در این سیستم، هر کاربر تنها دارای یک نشست فعال است.
register <user> <password> <role> <timestamp>
login <user> <password> <timestamp>
logout <session> <timestamp>
withdraw <session> <amount> <timestamp>
deposit <session> <amount> <timestamp>
transfer <session> <target_user> <amount> <timestamp>
log <level> <starttime> <finishtime> <timestamp>
هر یک از این دستورات، در واقع شبیهسازی انجام آنها در واقعیت است. در ادامه، عملکرد هر دستور را به طور کامل شرح میدهیم.
این دستور کاربر جدیدی را با اطلاعات زیر ثبت میکند:
<user>
: نام کاربری.<password>
: رمز عبور.<role>
: نقش کاربر که میتواند "admin"
یا "user"
باشد.<timestamp>
: زمان ثبتنام به فرمت yyyy/MM/dd:HH:mm:ss
.نام کاربری به ازای هر کاربر منحصر به فرد است. همچنین موجودی اولیه تمام کاربرانی که ثبتنام میکنند، در ابتدا صفر میباشد.
اگر کاربر قبلاً ثبت شده باشد، لاگ خطای "user already registered"
از نوع ERROR
ثبت شود و اطلاعات آن کاربر در سیستم ثبت نشود. در غیر اینصورت، لاگ اطلاعات "user registered successfully"
از نوع INFO
ثبت شود.
کاربر با نام کاربری و رمز عبور معتبر وارد سیستم میشود:
"invalid credentials"
با نوع ERROR
ثبت کنید."already logged in"
با نوع INFO
ثبت کنید. سپس در صورتی که از نشست (session
) قبلی بیش از ۱۰ دقیقه زمان گذشته باشد، یک نشست جدید برای آن کاربر ایجاد و نشست قبلی حذف شود. در غیر این صورت، تغییری در سیستم ایجاد نخواهد شد و کاربر وارد حسابش میشود.INFO
با پیام "user logged in successfully"
ثبت میشود.مکانیزم تولید session ID
:برای هر ورود موفق، یک شناسه یکتا (session ID
) به کاربر اختصاص داده میشود. این شناسه در واقع یک شمارنده افزایشی با شروع از ۱ است و به ازای هر ورود کاربران، یکی افزایش پیدا میکند.
این دستور کاربر را از سیستم خارج میکند و session
مربوط به او را از حافظه حذف میکند:
"session expired or invalid"
با نوع ERROR
ثبت میشود.INFO
با پیام "user logged out"
ثبت شود.این دستور به کاربر اجازه برداشت مبلغ مشخصی به اندازه amoumt
از حساب را میدهد:
<session>
: شناسه نشست کاربر.<amount>
: مبلغ برداشت.<timestamp>
: زمان درخواست.قوانین:
"session expired"
با نوع ERROR
ثبت شود.<timestamp>
اجرای دستور و زمان ورود (login
) استفاده کنید. سیستم باید از فرمت زمانی yyyy/MM/dd:HH:mm:ss
استفاده کند."insufficient funds"
با نوع ERROR
ثبت میشود.INFO
با پیام "amount withdrawn successfully"
ثبت شود.مبلغ مشخصی را به حساب کاربر اضافه میکند.
"session expired"
با نوع ERROR
ثبت شود.INFO
با پیام "amount deposited successfully"
ثبت شود.این دستور به کاربران اجازه میدهد مبلغی را از حساب خود به حساب کاربر دیگری انتقال دهند:
<session>
: شناسه نشست کاربر فرستنده.<target_user>
: نام کاربری دریافتکننده.<amount>
: مبلغ انتقال.<timestamp>
: زمان درخواست.قوانین:
"session expired"
با نوع ERROR
ثبت شود. "target user not found"
با نوع ERROR
ثبت کنید."insufficient funds"
با نوع ERROR
ثبت کنید.INFO
با پیام "amount transferred successfully"
ثبت شود.این دستور برای کوئری زدن روی لاگهای سیستم استفاده میشود:
<level>
: سطح لاگ که میتواند error
، info
یا debug
باشد.<t1>
و <t2>
: بازه زمانی که لاگها باید در آن جستجو شوند. این پارامترها اختیاری هستند؛ اگر t1
و t2
ارائه نشود، همه لاگهای موجود با سطح مشخصشده بدون توجه به زمان بازگردانده شوند. <timestamp>
: زمان ارسال درخواست برای اجرای دستور log
است.get log [level] [t1] [t2] [timestamp]
با نوع DEBUG
در سیستم ثبت و در کنسول چاپ شود.خروجی:
<level>
است.[<t1>, <t2>]
قرار دارد."no logs found"
در کنسول چاپ شود.پس از انجام هر نوع عملیات، لاگ آن در سیستم ثبت میشود. همچنین پس از ثبت لاگ، خروجی آن با فرمت
در کنسول چاپ میشود.
هر دستور، یک پارامتر <timestamp>
با فرمت زمانی yyyy/MM/dd:HH:mm:ss
دارد که نشان میدهد آن دستور در چه زمانی اجرا شده است. از این زمان باید در دستور log
برای فیلتر کردن لاگها استفاده کنید.
دستورات نامعتبر:
ورودی تضمینشده:
برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.
در صورتی که هر یک از بخشهای مسئله را به درستی پیادهسازی کردید، امتیاز آن را مستقل از سایر بخشها خواهید گرفت. (البته، دقت کنید برای دریافت امتیاز عملیات withdraw
، ابتدا باید عملیات deposit
به درستی پیادهسازی شود.)
سطر اول ورودی شامل یک عدد صحیح و مثبت است که تعداد سطرهای ورودی را نشان میدهد. در سطر بعدی، هر سطر شامل یکی از دستورهای بالا است.
خروجیهای خواسته شده برای هر دستور را به ترتیب چاپ کنید.