اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2015-01-03 08:52:08 -0500
  • مشاهده شده: 242 بار
  • بروز شده: 2015-01-04 05:04:37 -0500

پرسش‌های مشابه:

وبسایت مسابقه‌های برنامه نویسی

یافتن کوتاه ترین دور در گراف ساده

راهنمایی برای برنامه نویسی

کد مساله هشت وزیر با استفاده از الگوریتم ژنتیک

مجموع ارقام ! 100

مرجع فارسی برای الگوریتم های هندسی و 2sat

نظریه اعداد لازم برای المپیاد کامپیوتری ها

برای مرحله سوم، تا چه سطحی باید برنامه نویسی بلد باشیم؟

اولین جمله از دنباله ی فیبوناچی که 1000رقم داشته باشد چیست؟

چه جاج‌هایی برای المپیاد کامپیوتر خوب هستند؟

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

آقای تازه کار و رشته دودویی (برنامه نویسی)

4

آقای تازه کار(No0oB) یه رشته n رقمی از 0 و 1 دارد او هر بار می تواند یکی از دو عمل زیر را انجام دهد:

1) سمت چپ ترین خانه را عوض کند.(از 1 به 0 یا از 1 به 0)

2)سمت چپ ترین 1 را انتخاب کند و سپس خانه ی سمت راست آن را عوض کند.

حالا آقای تازه کار می خواهد رشته اش را به رشته ای شامل n تا 0 تبدیل کند. او حداقل چند عملیات باید انجام دهد؟؟

محدودیت ها: $(1<= n <= 1000 ) $

Time limit = 1s

memory16mb

ورودی : هم اول n رو میده بعد رشته ی n رو میده.

خروجی : تعداد حرکات لازم.

ورودیی نمونه :

4

0 1 0 1

خروجی نمونه :

6

راهنمایی مثال:

0 1 0 1 $<-$ 0 1 1 1 $<-$ 0 1 1 0 $<-$ 0 0 1 0 $<-$ 0 0 1 1 $<- $ 0 0 01 $<-$ 0 0 0 0

برنامه-نویسی
2015-01-03 08:52:08 -0500
پوبا 780 ● 3 ● 13 ● 22
پاک‌کردن   ویرایش سوال
نظرات

10001 جواب چنده؟

2015-01-03 09:57:57 -0500 چشمک

30

2015-01-03 10:24:42 -0500 پوبا

حداقل

2015-01-03 13:02:50 -0500 حمیدرضاه

بله

2015-01-03 13:04:20 -0500 پوبا

من فکر کنم حلش کردم . انشاالله به زودی کد میزارم.

2015-01-03 13:20:09 -0500 تاکسیران

2 پاسخ

3

این کدشه. با زمان $O(n)$ عمل میکنه و حافظه $O(n)$ هم میخواد که در صورت سوال هر دو شو$O(n^2)$ خواسته بود. فقط توجه داشته باشید که تو ورودی اول n رو , بعد هم یه رشته از کاراکتر هارو وارد کنید(فاصله نندازین)مثلا:

5

10001

(کمی!!)توضیحات:

الگوریتم از این قراره:

رشته ورودی رو S میگیریم و $S[i]$ بیانگر حرف i ام رشته است.

سه تا تابع تعریف میکنیم:

$f0(n)$ : به معنی حداقل تعداد حرکات لازم برای تبدیل n حرف اول S از سمت چپ به 0.

$f1(n)$ : به معنی حداقل تعداد حرکات لازم برای تبدیل n-1 حرف اول S از سمت چپ به 0 و حرف n ام از سمت چپ به 1.

$g(n)$ : به معنای حداقل تعداد حرکات لازم برای تبدیل رشته $000...001$ به رشته $000...000$ طوری که طول رشته n است و رشته در سمت چپ S قرار دارد.برای مثال $ g(1)=1 $ و $ g(2)=3$.

هدف پیدا کردن $f0(n)$ است.

اول رابطه بازگشتی برای $g$ رو پیدا میکنیم.

اولا که چون میشه حرکاتو از آخر به اول انجام داد پس $g(n)$ رو میشه این طوری هم تعریف کرد:

حداقل تعداد حرکات لازم برای تبدیل رشته $000...000$ به رشته $000...001$ طوری که طول رشته n است و رشته در سمت چپ S قرار دارد.

فرض کنیم رشته $000...001$ رو داریم.چون تنها راه برای تبدیل 1 آخر رشته به 0 اینه که عدد قبلیش 1 باشه و همه عدد های قبل تریش 0 باشن(در واقع چپ ترین 1 باید قبل از اون باشه)پس اول باید رشته شامل n-1 عدد اول رو به $000...001$تبدیل کنیم که $g(n-1)$ حرکت میخواد.بعد عدد n ام رو 0 میکنیم که 1 حرکت میخواد و بعدش هم دوباره باید n-1 حرف اول رو تبدیل به 0 کنیم که $g(n-1)$ حرکت میخواد.یعنی:

$g(n)=2g(n-1)+1$

حالا رابط بازگشتی برای f0 و f1 رو پیدا میکنیم.

برای f0 داریم:

اگه عدد n ام S برابر 0 باشد آنگاه $f0(n)=f0(n-1)$ و اگر عدد n ام برابر 1 باشد آنگاه برای 0 کردن آن باید ابتدا n-1 عدد اول را به $000...001$ تبدیل کنیم که حداقل $f1(n-1)$ حرکت میخواهد و عدد n ام را عوض میکنیم که 1 حرکت میخواهد و سپس n-1 عدد اول را که $000...001$ اند تبدیل به $000...000$ میکنیم که $g(n-1)$ حرکت میخواهد.یعنی داریم:

image description

برای f1 داریم:

اگر عدد n ام برابر 1 باشد آنگاه فقط باید n-1 عدد قبلی را 0 کرد که حداقل $f0(n-1)$ حرکت میخواهد و اگر عدد n ام برابر 0 باشد باید ابتدا n-1 عدد اول را به $000...001$ تبدیل کنیم که حداقل $f1(n-1)$ حرکت میخواهد و عدد n ام را عوض میکنیم که 1 حرکت میخواهد و سپس n-1 عدد اول را که $000...001$ اند تبدیل به $000...000$ میکنیم که $g(n-1)$ حرکت میخواهد.

image description

برای کدش هم کافیه 3 تا آرایه بگیریم.مقدار دهی اولیه هم به این شکله:

$g(1)=1$

$f0(1)=s[1]$

$f1(1)=1-s[1]$

سوال جالبی بود. موفق باشید!

2015-01-03 14:20:58 -0500
روبیک 2379 ● 13 ● 27 ● 44
پاک‌کردن   ویرایش پاسخ
نظرات

بهتر بود به جاي لفظ تابع از آرايه استفاده مي كردي. ولي دمت گرم ؛)

2015-01-04 00:43:59 -0500 دوردورترازدسترس

جاجش نیست؟

2015-01-04 01:20:47 -0500 روبیک

آفرین !

2015-01-04 01:21:50 -0500 چشمک

ممنون.

2015-01-04 01:22:14 -0500 روبیک

احسنت!! راه حل خیلی زیبایی بود.

2015-01-04 02:24:56 -0500 محمد مهدی
3

اینم کد منه که با bignum زدم

2015-01-04 05:04:37 -0500
پوبا 780 ● 3 ● 13 ● 22
پاک‌کردن   ویرایش پاسخ
نظرات

ايول كدتو دوست دارم. خيلي خوشگله ؛) ولي هر چقدر متغير global كمتر باشه كد بهتره.

2015-01-04 05:56:03 -0500 دوردورترازدسترس

+1

2015-01-04 07:00:15 -0500 دوردورترازدسترس

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.