یک نوار حافظه با تعداد بسیار زیادی خانه داریم که در ۱۰۰۰ خانه اول آن، ۱۰۰۰ عدد ذخیره شدهاند و در بقیه خانههای آن عدد صفر نوشته شده است. تعداد زیادی پردازنده هم وجود دارند. در هر نوبت هر پردازنده میتواند دوتا از خانههای این حافظه را بخواند و بر اساس این دو عدد، عدد دلخواهی را در یکی از خانههای این نوار حافظه بنویسید(همه این کارها در یک نوبت انجام میشود). توجه کنید که در هر نوبت همه پردازندهها میتوانند با هم عمل کنند. اگر چند پردازنده در یک نوبت بخواهند روی یک خانه حافظه به طور مشترک عددی را بنویسند. یکی از این اعداد به طور تصادفی نوشته میشود. میخواهیم پردازندهها طوری عمل کنند که پس از حداقل تعداد نوبتها بزرگترین عدد از بین ۱۰۰۰ عدد در خانه اول حافظه نوشته شود.
پاسخ
برای حل قسمت اول کافی است توجه کنید که $lg(1000)<10$. بنابراین در نوبت اول اعداد را به ۵۰۰ زوج تقسیم کرده (خانه ۱ و ۲، خانه ۳ و ۴ و به همین ترتیب) و هر پردازنده با مقایسه دو عدد یک زوج عدد بزرگتر را در خانه کوچکتر (مثلا از بین زوج ۳ و ۴ عدد بزرگتر در خانه ۳ نوشته میشود) مینویسد. حال در نوبت دوم همین ۵۰۰ خانه را به ۲۵۰ زوج تقسیم میکنیم و …
اما این کار را تنها با ۲ حرکت هم میتوان انجام داد: در نوبت اول به ازای هر دو خانه $(1\leq i,j \leq 1000)i,j$، یک پردازنده در نظر میگیریم و برنامه کاری این پردازنده را به این صورت مشخص میکنیم که اگر $i$ بزرگتر بود، در خانه $1000+j$ عدد ۱ بنویسید و اگر $j$بزرگتر بود در خانه $1000+i$ عدد ۱ را بنویسید. با کمی دقت خواهید فهمید که پس از نوبت اول، اگر در یک خانه $i$ از بین خانههای ۱۰۰۱ تا ۲۰۰۰ عدد صفر وجود داشته باشد، خانه $i-1000$ حاوی عدد ماکزیمم بوده است. پس خیلی راحت در نوبت دوم ۱۰۰۰ پردازنده در نظر میگیریم که هر یک، یکی از خانههای $(1001\leq i \leq 2000)i$ را به همراه خانهی $i-1000$ چک کند و در صورتی که عدد موجود در خانهی $i$ صفر بود، عدد موجود در خانه $i-1000$ را در خانه ۱ بنویسید.