Loading [MathJax]/jax/output/HTML-CSS/jax.js

المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:مرحله ی اول:دوره ی ۷:سوال ۲۶

سوال ۲۶

الگوریتم زیر را در نظر بگیرید. در این الگوریتم n یک عدد طبیعی و A یک آرایه است که عنصر iام آن را با A[i] نشان می‌دهیم.

  • A[1] را مساوی با صفر و A[2] را مساوی یک قرار بده.
  • برای هر i از ۲ تا n کار زیر را انجام بده:
    • برای هر j از 2i1+1 کار زیر را انجام بده:
    • A[i] را مساوی با [2ij+1]+2i1 قرار بده.

کدام یک از گزاره‌های زیر در مورد مقدار آرایه‌ی A پس از اجرای این الگوریتم٬ درست است؟

  1. دنباله‌ی اعدد صفر تا 2n1 به ترتیب صعودی در A قرار دارد.
  2. هر دو عدد متوالی از آرایه‌ی A در مبنای ۲ دقیقا در یک رقم متفاوت هستند.
  3. آرایه‌ی A شامل عناصر تکراری است.
  4. عناصر اول تا 2n1ام آرایه A به ترتیب صعودی و بقیه عناصر به ترتیب نزولی هستند.
  5. گزینه‌های ۳ و ۴ درست‌اند.

پاسخ

گزینه (۲) درست است.

به ازای j=1,2,...,16 خواهیم داشت:

A(1)=0A(2)=1A(3)=3A(4)=2A(5)=6A(6)=7A(7)=5A(8)=4A(9)=12A(10)=13A(11)=15A(12)=14A(13)=10A(14)=11A(15)=9A(16)=8

غلط بودن گزینه‌های ۴٬۱ و ۵ واضح است. برای به دست آوردن A(2n+1) تا A(2n+1) باید مقادیر A(2n) تا A(1) را (نه به ترتیب) با مقدار ثابت 2n جمع کرد. پس اگر A(2n) تا A(1) عضو تکراری نداشته باشد به استقرا معلوم می‌شود که A(2n+1) تا A(2n+1) نیز عضو تکراری نخواهد داشت٬ ضمن اینکه به عنوان مثال از A(1) تا A(8) عضو تکراری وجود ندارد(پایه‌ی استقرا). پس گزینه‌ی ۳ نیز غلط می‌باشد.

و اما گزینه‌ی ۲ صحیح است. استدلال٬ مشابه استدلال فوق است چون هر دو عدد متوالی از A(1) تا A(8) در مبنای ۲ دقیقا در یک رقم متفاوت هستند پس اگر آنان را با 23 (در مبنای ۲ به صورت ۱۰۰۰) جمع کنیم فقط رقم آخر از سمت چپ آنان از صفر به ۱ تغییر خواهند یافت…


ابزار صفحه