اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!
وبسایت مسابقههای برنامه نویسی
یافتن کوتاه ترین دور در گراف ساده
کد مساله هشت وزیر با استفاده از الگوریتم ژنتیک
مرجع فارسی برای الگوریتم های هندسی و 2sat
نظریه اعداد لازم برای المپیاد کامپیوتری ها
برای مرحله سوم، تا چه سطحی باید برنامه نویسی بلد باشیم؟
اولین جمله از دنباله ی فیبوناچی که 1000رقم داشته باشد چیست؟
چه جاجهایی برای المپیاد کامپیوتر خوب هستند؟
در این قسمت میتونی به یک پرسش پاسخ بدی. اگه میخوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخها مفید هستند حتما بهشون رای بده تا پرسشها و پاسخهای خوب مشخص بشن.
توی قسمت پیشنمایش میتونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
میتونی از تگهای معمولی و سادهی html هم استفاده کنی.
با دکمههایی که بالای ویرایشگر قرار دارند کلی کار میشه کرد. از عکسگذاشتن بگیر تا لیست شمارهدار. حتما امتحانشون کن.
برای نوشتن علائم ریاضی میتونی از Mathjax استفاده کنی.
راهنمای Mathjax رو از سایت
math.stackexchange
بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.
آقای تازه کار(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
این کدشه. با زمان $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)$ حرکت میخواهد.یعنی داریم:
برای 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)$ حرکت میخواهد.
برای کدش هم کافیه 3 تا آرایه بگیریم.مقدار دهی اولیه هم به این شکله:
$g(1)=1$
$f0(1)=s[1]$
$f1(1)=1-s[1]$
سوال جالبی بود. موفق باشید!
بهتر بود به جاي لفظ تابع از آرايه استفاده مي كردي. ولي دمت گرم ؛)
2015-01-04 00:43:59 -0600 دوردورترازدسترساینم کد منه که با bignum زدم
ايول كدتو دوست دارم. خيلي خوشگله ؛) ولي هر چقدر متغير global كمتر باشه كد بهتره.
2015-01-04 05:56:03 -0600 دوردورترازدسترس