لینک‌های مفید برای شرکت در مسابقه:

در قسمت آموزشی برای حل سوالات، سه سری راهنمایی به انتهای سوالات اضافه می‌شود. زمان اضافه شدن راهنمایی‌ها را می‌توانید در قسمت آموزشی پایین سوالات ببینید.‌ همچنین می‌توانید سوال‌های خود را از بخش "سوال بپرسید" مطرح کنید.

جاستیفای


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

امین یک متن حاوی nn کلمه دارد و می‌خواهد آن‌ها را مرتب کند برای این کار یک عدد صحیح ww انتخاب کرده و می‌خواهد آن را در سطر‌هایی که ظرفیت حداکثر ww کاراکتر دارند، بنویسد.

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

می‌خواهیم اشکالاتی که در کوچک یا بزرگ بودن حروف وجود دارد را برطرف کنیم. یعنی همه حروف نوشته شده باید کوچک باشند به جز حرف اولِ کلمه‌ی اول جملات. می‌دانیم که جملات با کلماتی ختم می‌شوند که در انتهای آن‌ها . ، ؟ یا ! داشته باشند.

حال می‌خواهیم همه این سطرها را جاستیفای کنیم! یعنی تعداد تقریباً مساوی فاصله بین کلمات هر سطر قرار دهیم تا کلمه‌ی آخر هر سطر به انتهای آن سطر برسد.

اگر یک کلمه در یک سطر باشد آن را در ابتدای سطر می‌نویسیم و بقیه سطر را با کاراکتر space پرکنیم.

در غیر این صورت فرض کنید mm کلمه در یک سطر داشته باشیم. می‌خواهیم در بین m1m-1 فاصله ایجاد شده توسط اینmm کلمه تعدادی کاراکتر space قرار دهیم به طوری که اختلاف تعداد spaceهای موجود در این فواصل حداکثر برابر یک باشد، همچنین کلمه آخر به انتهای سطر رسیده باشد.

به عبارت دیگر برای هر سطر عددی مانند kk وجود دارد که فاصله بین کلمات آن سطر همگی kk یا k+1k + 1 باشد.

فرض کنید برای اینکار باید rr از فاصله‌ها k+1k + 1 اسپیس، و m1rm-1-r تا kk تا اسپیس داشته باشند، می‌خواهیم r2\lfloor \frac{r}{2}\rfloor تا از فواصل k+1k + 1تایی بین کلمات ابتدایی سطر باشد و r2\lceil \frac{r}{2} \rceil تا از فواصل k+1k + 1تایی بین کلمات انتهایی سطر باشد.

در نهایت تعداد کاراکترهای چاپ شده در هر سطر باید دقیقاً ww باشد. با احتساب فاصله‌ها (یا همان spaceها)

ورودی🔗

در ورودی به شما tt مثال داده می‌شود.

1t1001 \le t \le 100

در هر مثال در سطر اول عدد nn و عدد ww داده می‌شود و در سطر دوم nn کلمه با فاصله از هم داده می‌شود.1n1001 \le n \le 100 2w2 0002 \le w \le 2\ 000

هر کلمه رشته حداکثر ۲۰ کاراکتری است که از حروف کوچک و بزرگ انگلیسی تشکیل شده است، به انتهای برخی از کلمات حداکثر یکی از کاراکترهای . یا ؟ یا ! یا, چسبیده است.

تضمین می‌شود آخرین کلمه با یکی از کاراکترهای . یا ؟ یا ! ختم می‌شود.

تضمین می‌شود مقدار ww از طول بزرگ‌ترین کلمه داده شده در هر مثال کمتر نخواهد بود.

خروجی🔗

خروجی خواسته شده در مسئله را مطابق مثال‌ها چاپ کنید. برای نشان دادن ابتدا و انتهای خطوط از کارکتر | مطابق با مثال‌ها استفاده کنید.

مثال🔗

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

2
2 6
caReEr dAyS!
6 10
Are You Ready For This Question?
Plain text

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

|Career|
|days! |
|Are    you|
|ready  for|
|this      |
|question? |
Plain text

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

1
34 20
this is going to be a big sample to show how you should solve this problem. I hope this sample can show you what you want. please, try to solve this problem. love you!
Plain text

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

|This is going to  be|
|a big sample to show|
|how you should solve|
|this problem. I hope|
|this sample can show|
|you  what you  want.|
|Please, try to solve|
|this  problem.  Love|
|you!                |
Plain text

قسمت آموزشی🔗

در این قسمت راهنمایی‌های سوال، به مرور اضافه می‌شود. مشکلات‌تان در راستای حل سوال را می‌توانید از بخش "سوال بپرسید" مطرح کنید.

راهنمایی ۱

در ابتدا حروف انگلیسی بزرگ در تمام کلمات را به حروف کوچک تبدیل کنیم. سپس حرف اول کلمه اول متن و حرف اول (در صورت وجود) بعد از هر کاراکتر .، ! یا ؟ را به بزرگ تغییر می‌دهیم.

در واقع آغاز یک جمله را از پایان جمله قبلی تشخیض می‌دهیم.

راهنمایی ۲

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

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

راهنمایی ۳

فرض کنید کلمات در یک تست داده شده s1,s2,s3,,sns_1, s_2, s_3, \dots, s_n باشد.

for i from 1 to n:
    change upper_case letter of s[i] to lower_case

change first letter of s[0] to upper_case
for i from 1 to n - 1:
    if s[i] ends with '.' or '!' or '?':
         change first letter of s[i + 1] to upper_case

for i from 1 to n:
    if can add s[i] to this_line without exceed w:
        add s[i] to this_line
    else:
        add this_line to all_lines
        make this_lines clear

for each line in all_lines:
    justify(line, w)
Plain text

حال فرض کنید می‌خواهیم برای یک خط دستور justify را پیاده سازی کنیم. اکنون فرض کنید l1,l2,l3,lml_1, l_2, l_3 \dots, l_m کلمات یک خط باشد.

if m = 1:
    print '|' + l[1] + ' ' * (w - (length of l[1])) + '|'
else: 
    spaces = w - (sum of length l[i] for all i from 1 to m)

    for i from 1 to m - 1:
        x[i] = floor(spaces / (m - 1))
    remaining_space = space % (m - 1)

    for i from 1 to floor(m / 2):
        x[i] = x[i] + 1

    for i from 1 to ceil(m / 2):
        x[m - i] = x[m - i] + 1

    print '|'
    for i from 1 to m - 1:
        print l[i]
        print ' ' * x[i]
    print l[m] + '|'
Plain text
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.