الگوریتمی - ژنرال


  • محدودیت زمان سی پلاس پلاس: ۱ ثانیه
  • محدودیت زمان جاوا: ۲ ثانیه
  • محدودیت زمان پایتون: ۳ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

آرایش‌ها🔗

  1. آرایش اول: هر تانک با فاصله ۳ متر در سمت چپ تانک قبلی قرار می‌گیرد.
  2. آرایش دوم: هر تانک با فاصله ۳ متر در سمت راست تانک قبلی قرار می‌گیرد.

نکات🔗

  • نمی‌توانید موقعیت تانک اول را تغییر دهید و فقط با جابه‌جایی تانک‌های دیگر باید به آرایش مورد نظر برسید.
  • اگر مجموع جابه‌جایی‌های دو آرایش برابر شود، باید آرایش اول را به عنوان جواب انتخاب کنید.

ورودی🔗

در خط اول ورودی، nn می‌آید که بیانگر تعداد تانک‌هاست. سپس در خط بعد، مختصات nn تانک به ترتیب به صورت دنباله‌ای از xix_iها می‌آید.

5n10 000 5 \leq n \leq 10\ 000 50 000xi50 000 -50\ 000 \leq x_i \leq 50\ 000

خروجی🔗

در خروجی، مقدار جابه‌جایی هر تانک را به ترتیب در خطوط جداگانه چاپ کنید.

ورودی نمونه ۱🔗

6
3 -1 4 -1 6 2
Plain text

خروجی نمونه ۱🔗

0
+1
-7
-5
-15
-14
Plain text
توضیح نمونه ۱

قبل

  • از آنجایی که موقعیت تانک اول باید ثابت باشه، همیشه مقدار جابه‌جایی آن ۰ است.
  • برای آنکه تانک دوم با فاصله ۳ متر در سمت چپ تانک اول قرار گیرد، باید ۱ متر به سمت راست جابه‌جا شود.
  • برای آنکه تانک سوم با فاصله ۳ متر در سمت چپ تانک دوم قرار گیرد، باید ۷ متر به سمت چپ جابه‌جا شود.
  • به همین صورت، تانک‌های چهارم، پنجم و ششم باید به ترتیب ۵، ۱۵ و ۱۴ متر به سمت چپ جابه‌جا شوند.

مجموع این جابه‌جایی‌ها ۴۲ متر است و به همین صورت مجموع جابه‌جایی‌های آرایش دوم، برابر ۵۰ می‌شود؛ بنابراین آرایش اول را به‌عنوان جواب انتخاب می‌کنیم.

بعد

ورودی نمونه ۲🔗

5
-8 -9 1 5 7
Plain text

خروجی نمونه ۲🔗

0
+4
-3
-4
-3
Plain text
توضیح نمونه ۲

در صورتی که آرایش اول را انتخاب کنیم، باید تانک‌ها را به ترتیب ۰، ۲-، ۱۵-، ۲۲- و ۲۷- متر جابه‌جا کنیم؛ اما اگر آرایش دوم را انتخاب کنیم، باید تانک‌ها را به ترتیب ۰، ۴+، ۳-، ۴- و ۳- متر جابه‌جا کنیم؛

مجموع جابه‌جایی‌ها در آرایش اول برابر با ۶۶ و در آرایش دوم برابر با ۱۴ می‌شود؛ بنابراین آرایش دوم را به عنوان جواب انتخاب می‌کنیم.

الگوریتمی - نبرد هوایی


  • محدودیت زمان سی پلاس پلاس: ۱ ثانیه
  • محدودیت زمان جاوا: ۲ ثانیه
  • محدودیت زمان پایتون: ۱۰ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

تعداد جنگنده‌هایی را که یک جنگنده می‌تواند مورد هدف قرار دهد، عدد استراتژیک می‌نامیم. به عنوان مثال اگر جنگنده الف بتواند ۳ جنگنده را مورد هدف قرار دهد، می‌گوییم عدد استراتژیک جنگنده الف برابر با ۳ است.

مجموع اعداد استراتژیک تمام جنگنده‌ها را بدست آورید.

ورودی🔗

در خط اول ورودی، nn می‌آید که بیانگر تعداد جنگنده‌هاست. سپس در خط بعد، ارتفاع nn جنگنده به ترتیب به صورت دنباله‌ای از hih_i ها می‌آید.

1n100 000 1 \leq n \leq 100\ 000 1hi100 000 1 \leq h_i \leq 100\ 000

خروجی🔗

در خروجی، مجموع اعداد استراتژیک تمام جنگنده‌ها را چاپ کنید.

ورودی نمونه ۱🔗

5
5 4 3 7 6
Plain text

خروجی نمونه ۱🔗

4
Plain text
توضیح نمونه ۱

اولین جنگنده با ارتفاع ۵ از همه عقب‌تر است و امکان شلیک به جنگنده دوم و سوم را دارد. در نتیجه عدد استراتژیک آن ۲ است. جنگنده دوم می‌تواند جنگنده سوم را هدف قرار دهد و عدد استراتژیک آن ۱ است. جنگنده سوم امکان شلیک به جنگنده چهارم و پنجم را به دلیل ارتفاع کمتر ندارد و عدد استراتژیک آن ۰ است. به همین صورت عدد استراتژیک جنگنده چهارم، ۱ و جنگنده پنجم، ۰ است. در نتیجه مجموع اعداد استراتژیک جنگنده‌ها برابر ۴ خواهد بود.

ورودی نمونه ۲🔗

30
16 6 17 15 21 18 20 28 3 4 11 9 5 13 27 29 10 7 12 25 2 19 30 24 23 26 1 8 22 14
Plain text

خروجی نمونه ۲🔗

202
Plain text

الگوریتمی - مدیریت شهری


  • محدودیت زمان سی پلاس پلاس:‌ ۲/۵ ثانیه
  • محدودیت زمان جاوا: ۳/۵ ثانیه
  • محدودیت زمان پایتون: ۵ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

در یک بازی مدیریت شهری، باید ۳ ساختمان را به شکلی مدیریت کنید که مصرف برق آن‌ها به بهینه‌ترین حالت ممکن برسد. برای فهمیدن این موضوع، داور بازی در هر مرحله mm کار انجام می‌دهد تا تعداد امتیازهای منفی را محاسبه کند. این کارها یکی از دو نوع زیر می‌باشند:

  1. داور مصرف برق واحد kkام از ساختمان aa را به xx تغییر می‌دهد. به بیانی ak=xa_k = x.
  2. داور با دادن مقدار rr به دنبال سه واحد ii و jj و kk از سه ساختمان aa و bb و cc می‌گردد که شرایط زیر را داشته باشند و به ازای هر بار یافتن این الگو یک امتیاز به بازیکن می‌دهد: 1i<j<kr1≤i<j<k≤r bai=aj=cakb_{a_i} = a_j = c_{a_k}
    • منظور از aia_i مصرف برق واحد iiام از ساختمان aa می‌باشد.

ورودی🔗

در خط اول ورودی عدد nn به عنوان تعداد واحدهای سه ساختمان و mm به عنوان تعداد کارهایی که داور انجام می‌دهد داده می‌شوند. 1n200 000 1 \leq n \leq 200\ 000 1m500 000 1 \leq m \leq 500\ 000

در ادامه در سه خط سه دنباله به طول nn به ترتیب به عنوان مصرف برق واحدهای ساختمان aa و bb و cc داده می‌شود.

1ai,bi,cin 1 \leq a_i, b_i, c_i \leq n

در ادامه در mm خط کارهای داور می‌آیند که به قالب زیر هستند:

CHANGE(k,x) := عنصر kkام در دنبالۀ اول به xx تغییر می‌کند

PRINT(r) := کار نوع دوم است که در جوابش یک عدد (امتیازهایی که به بازیکن می‌دهد) باید بدهید

1k,x,rn 1 \leq k, x, r \leq n

خروجی🔗

به ازای هر پرسش نوع دوم، مقدار عددی خروجی را چاپ کنید.

ورودی نمونه ۱🔗

5 4
1 2 3 4 5
2 3 4 5 1
5 1 2 3 4
PRINT(5)
CHANGE(2,3)
PRINT(4)
PRINT(5)
Plain text

خروجی نمونه ۱🔗

3
0
2
Plain text

پیاده‌سازی - تفنگ‌بازی (جاوا)


  • محدودیت زمان جاوا: ۲ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

سلاح‌ها🔗

نام برد قدرت اندازۀ گلوله
Submachine Gun 100 10 0.5
Assault Rifle 200 20 1
Pistol 80 8 0.5
Shotgun 50 40 4
Sniper Rifle 1000 30 3

گلوله‌ها🔗

نام اندازه آسیب
A 0.5 1
B 1 1.5
C 3 3
D 4 2

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها
GunProblemExample.zip
├── Shooter.java
└── ShootingContract.java
Plain text

خواسته‌های مسئله🔗

با توجه به انواع سلاح‌ها و گلوله‌ها یک کلاس ایجاد کنید که Interface زیر را پیاده‌سازی کند:

public interface ShootingContract {
    void setGunByName(String name) throws Exception;

    void addBulletOfGivenSizeToGun(float size, int count) throws Exception;

    float shootToTarget(int targetX, int targetY, int targetDistance, int aimX, int aimY) throws Exception;
}
Java

در بالا، به ترتیب سه متد انتخاب سلاح، اضافه‌کردن گلوله و شلیک به هدف تعریف شده‌اند که به توضیح آن‌ها می‌پردازیم:

  • متد انتخاب سلاح با توجه به ورودی، یک سلاح را انتخاب می‌کند تا در ادامه از آن استفاده شود.

    • در صورتی که سلاحی با نام داده شده وجود نداشته باشد، باید یک Exception پرتاب شود.
    • این متد باید به حرف کوچک و بزرگ حساس باشد؛ به عنوان مثال سلاحی با نام submachine gun نداریم.
  • متد انتخاب گلوله، گلوله‌هایی را با اندازه و تعداد داده‌شده به سلاح اضافه می‌کند.

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

    • هدف، یک مربع به ضلع ۱۰ است.
    • مختصات گوشۀ پایین-چپ مربع در ورودی داده می‌شود.
    • برای محاسبۀ خروجی، به صورت زیر عمل می‌کنیم:
      • اگر مختصات نقطه‌ای که سلاح به آن اشاره می‌کند خارج از ابعاد هدف باشد، عدد ۰ برگردانده شود.
      • اگر برد سلاح از فاصله کمتر باشد، عدد ۰ برگردانده شود.
      • در غیر این صورت، حاصل‌ضرب قدرت اسلحه در آسیب گلوله برگردانده شود.
    • در صورتی که سلاحی انتخاب نشده باشد یا گلوله‌ای نداشته باشد، باید یک Exception پرتاب شود.

مثال🔗

public void caseA() {
    ShootingContract implementation = new Shooter();
    implementation.setGunByName("Submachine Gun");
    implementation.addBulletOfGivenSizeToGun(0.5f, 5);
    var damage = implementation.shootToTarget(0, 0, 20, 5, 5);
}
Java

نکات🔗

  • شما تنها مجاز به تغییر در فایل Shooter.java هستید. تغییرات در باقی فایل‌ها نادیده گرفته می‌شود.
  • توجه کنید که تمیزی کد مهم و در رتبه‌بندی نهایی تاثیرگذار است.
  • برای ثبت پاسخ، پروژه را با ساختار زیر ارسال کنید.
[your-zip-file-name].zip
└── Shooter.java
Plain text

پیاده‌سازی - تفنگ‌بازی (پایتون)


  • محدودیت زمان پایتون: ۲ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

سلاح‌ها🔗

نام برد قدرت اندازۀ گلوله
Submachine Gun 100 10 0.5
Assault Rifle 200 20 1
Pistol 80 8 0.5
Shotgun 50 40 4
Sniper Rifle 1000 30 3

گلوله‌ها🔗

نام اندازه آسیب
A 0.5 1
B 1 1.5
C 3 3
D 4 2

پروژه اولیه🔗

پروژه اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها
GunProblemSample.zip
├── Shooter.py
└── ShootingContract.py
Plain text

خواسته‌های مسئله🔗

با توجه به انواع سلاح‌ها و گلوله‌ها کلاس زیر را پیاده‌سازی کند:

class Shooter:

    def set_gun_by_name(self, name: str) -> None:

        pass

    def add_bullet_of_given_size_to_gun(self, size: float, count: int) -> None:

        pass

    def shoot_to_target(self, target_x: int,  target_y: int,  target_distance: int,  aim_x: int,  aim_y: int) -> float:

        pass
Python

در بالا، به ترتیب سه متد انتخاب سلاح، اضافه‌کردن گلوله و شلیک به هدف تعریف شده‌اند که به توضیح آن‌ها می‌پردازیم:

  • متد انتخاب سلاح با توجه به ورودی، یک سلاح را انتخاب می‌کند تا در ادامه از آن استفاده شود.

    • در صورتی که سلاحی با نام داده شده وجود نداشته باشد، باید یک Exception پرتاب شود.
    • این متد باید به حرف کوچک و بزرگ حساس باشد؛ به عنوان مثال سلاحی با نام submachine gun نداریم.
  • متد انتخاب گلوله، گلوله‌هایی را با اندازه و تعداد داده‌شده به سلاح اضافه می‌کند.

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

    • هدف، یک مربع به ضلع ۱۰ است.
    • مختصات گوشۀ پایین-چپ مربع در ورودی داده می‌شود.
    • برای محاسبۀ خروجی، به صورت زیر عمل می‌کنیم:
      • اگر برد سلاح از فاصله کمتر باشد، عدد ۰ برگردانده شود.
      • در غیر این صورت، حاصل‌ضرب قدرت اسلحه در آسیب گلوله برگردانده شود.
    • در صورتی که سلاحی انتخاب نشده باشد یا گلوله‌ای نداشته باشد، باید یک Exception پرتاب شود.

مثال🔗

shooter = Shooter()
shooter.set_gun_by_name('Submachine Gun')
shooter.add_bullet_of_given_size_to_gun(0.5, 1)
result = shooter.shoot_to_target(1, 1, 20, 5, 4)
# result should be 10
Python

نکات🔗

  • شما تنها مجاز به تغییر در فایل Shooter.py هستید. تغییرات در باقی فایل‌ها نادیده گرفته می‌شود.
  • توجه کنید که تمیزی کد مهم و در رتبه‌بندی نهایی تاثیرگذار است.
  • برای ثبت پاسخ، پروژه را با ساختار زیر ارسال کنید.
[your-zip-file-name].zip
└── Shooter.py
Plain text

پیاده‌سازی - کیک‌پزی


  • محدودیت زمان جاوا: ۲ ثانیه
  • محدودیت زمان پایتون: ۳ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

می‌خواهیم یک بازی کیک‌پزی بسازیم که در آن یک کیک ساده با اندازۀ مشخص به بازیکن داده می‌شود و او باید با انجام دستورالعمل برنامه‌ریزی شده، کیک نهایی را تحویل دهد.

دستورات🔗

پختن کیک با اندازۀ داده‌شده🔗

BAKE height width
Plain text

کیک اولیه را که مستطیلی با ارتفاع height و طول width از ooهاست، با توجه به دستورالعمل می‌پزد و آن را چاپ می‌‎کند.

1height<100 1 \leq height < 100 1width<100 1 \leq width < 100

مثال

با اجرای دستور زیر:

BAKE 3 5
Plain text

کیک اولیه، به این شکل خواهد شد:

ooooo
ooooo
ooooo
Plain text

فرمان‌های افزودن عملیات به دستورالعمل🔗

در ابتدای برنامه دستورالعمل خالی است. در نتیجه با اجرای فرمان پختن کیک، همان کیک اولیه خروجی داده می‌شود. با اجرای فرمان‌های زیر می‌توانیم به دستورالعمل، عملیات اضافه کنیم. حال اگر فرمان پخت کیک صادر شد، عملیات‌های افزوده شده به ترتیب روی کیک اولیه اجرا می‌شوند.

۱. افزودن خامه🔗

ADD OPERATION => ADD CREAM
Plain text

به بالا و طرفین آخرین طبقه کیک خامه (C) اضافه و عبارت Done را در خروجی چاپ می‌کند.

مثال

اگر کیک به این شکل باشد:

ooo
ooo
Plain text

پس از انجام عملیات، به این شکل خواهد شد:

CCCCC
CoooC
CoooC
Plain text

۲. افزودن طعم🔗

ADD OPERATION => ADD flavor TO where
Plain text

قسمت‌هایِ موردِ نظرِ آخرینِ طبقۀ کیک را به طعم مشخص‌شده آغشته و عبارت Done را در خروجی چاپ می‌کند.

flavor می‌تواند شکلات (K)، توت فرنگی (S) یا موز (B) باشد. where می‌تواند بالا (TOP) یا طرفین (SIDES) باشد.

مثال

اگر کیک به این شکل باشد:

oooo
oooo
oooo
Plain text

با اجرای دستور زیر:

ADD S TO TOP
Plain text

به این شکل خواهد شد:

SSSS
oooo
oooo
Plain text

۳. افزودن طبقه🔗

ADD OPERATION => ADD LAYER
Plain text

یک طبقه را با ابعاد کیک اولیه، بر روی کیک فعلی قرار می‌دهد و عبارت Done را در خروجی چاپ می‌کند.

مثال

اگر کیک اولیه ارتفاع ۲ و طول ۴ داشته و کیک فعلی به شکل زیر باشد:

CCCCCC
CBBBBC
CooooC
Plain text

به این شکل خواهد شد:

 oooo 
 oooo 
CCCCCC
CBBBBC
CooooC
Plain text

پایان برنامه🔗

END
Plain text

با اجرای این دستور، برنامه پایان می‌یابد.

نکات🔗

  • در نظر داشته باشید که دستورها همواره روی آخرین طبقه کیک اعمال می‌شوند. برای مثال اگر بخواهیم یک لایه خامه اضافه کنیم، تنها روی آخرین طبقه آن را انجام می‌دهیم.
  • کیک همواره متقارن است. بنابراین امکان یکسان نبودن طول طبقه‌ها را در نظر داشته باشید و فضای خالی را با space پر کنید. همچنین این امکان وجود دارد که طبقات بالایی طول بیشتری داشته باشند.
مثال

اگر کیک اولیه ارتفاع ۲ و طول ۳ داشته و کیک فعلی به شکل زیر باشد:

KKK
ooo
Plain text

با اجرای ادامه دستوالعمل به شکل زیر ممکن است بشود:

CCCCC
CoooC
CoooC
 KKK
 ooo
Plain text

ورودی🔗

در هر خط ورودی، یکی از دستوراتی که در بالا توضیح داده شد، می‌آید. برنامه با دستور END خاتمه می‌یابد.

خروجی🔗

با توجه به توضیحات بالا، به ازای هر دستور، خروجی مورد نظر را چاپ کنید.

ورودی نمونه ۱🔗

BAKE 1 1
ADD OPERATION => ADD CREAM
BAKE 2 3
ADD OPERATION => ADD K TO SIDES
BAKE 2 3
ADD OPERATION => ADD LAYER
BAKE 1 3
ADD OPERATION => ADD S TO SIDES
BAKE 1 3
ADD OPERATION => ADD B TO TOP
BAKE 1 3
END
Plain text

خروجی نمونه ۱🔗

o
Done
CCCCC
CoooC
CoooC
Done
KCCCK
KoooK
KoooK
Done
 ooo 
KCCCK
KoooK
Done
 SoS
KCCCK
KoooK
Done
 BBB 
KCCCK
KoooK
Plain text