m نقطه روی محور مختصات قرار دارند که هر کدام به یکی از رنگهای 1 تا n رنگآمیزی شدهاند.
اگر distance(x,color) برابر باشد با کمترین فاصله یک نقطه به رنگ color تا نقطهی x، تابع g به صورت زیر تعریف میشود:
g(x)=n∑i=1distance(x,i)2
شما باید تمام xهایی را بیابید که هیچ yای وجود نداشته باشد به طوری که g(y)<g(x).
ورودی نمونه | خروجی نمونه |
---|---|
3 5 -1 3 0 1 2 3 4 2 5 2 | 1 2.000 |
2 5 1 1 2 2 3 1 4 2 5 1 | 4 1.500 2.500 3.500 4.500 |
پاسخ
ابتدا فرض کنید که نقطهها رنگهای متفاوتی دارند و این نقاط در مختصات x1 تا xn قرار دارند که اینها به ترتیب صعودی مرتب شده اند. حالا مقدار تابع g را در نقطهی x=xi در نظر بگیرید. فاصلهی این نقطه تا xj را aj مینامیم. اگر این نقطه را به اندازهی d جلو ببریم به صورتی که از نقطهی xi+1 جلو نزند، در این صورت مقدار g در x+d به صورت زیر میشود:
g(x+d)=∑ij=1(aj+d)2+∑nj=i+1(aj−d)2=∑nj=1a2j+n×d2+2×d∑ij=1aj−2×d∑nj=i+1aj=g(xi)+n×d2+2×d∑ij=1aj−2×d∑nj=i+1aj
که g(x_i) همیشه مقداری ثابت است و ما دنبال d میگردیم که n \times d^2 + 2 \times d \sum_{j=1}^i a_j - 2 \times d \sum_{j=i+1}^n a_j را کمینه کند. اگر مقدار alpha(x_i) را 2 \times \sum_{j=1}^i a_j - 2 \times \sum_{j=i+1}^n a_j بگذاریم میخواهیم ببینیم به ازای چه d n \times d^2+alpha(x_i) \times d مینیمم می شود.
که این یک عبارت درجه دو برحسب d است و کمینهی آن به ازای d=\frac{(-alpha(x_i))}{2 \times n}. اگر d که پیدا میکنیم در بازهی ۰ تا x_{i+1} – x_i نیافتاد آنگاه انتهای بازه را به عنوان d در نظر می گیریم.حالا به ازای هر x_i یک x+d بدست میآید که در انتها باید بین تمام آنها مینمم بگیریم.
الگوریتم بالا را میتوان در O(n^2) پیاده سازی کرد. (چرا؟) برای بهتر کردن زمان فرض کنید ما در مرحلهی i ام هستیم یعنی x=x_i و در این مرحله alpha(x_i) و g(x_i) را میدانیم. میخواهیم با استفاده از این دو عدد g(x_{i+1}) و alpha(x_{i+1}) را محاسبه کنیم.
برای محاسبهی g(x_{i+1}) میتوانیم در همان رابطهی بالا برای بهدست آوردن g(x+d) d را برابر با x_{i+1} – x_i قرار دهیم. یعنی:
g(x_{i+1})=g(x_i)+n \times ( x_{i+1} – x_i )^2+alpha(x_i )( x_{i+1} – x_i )
و چون تمام نقاط تاثیرشان در alpha(x_{i+1} ) زیاد شدن به اندازه 2 \times (x_{i+1} – x_i)است پس رابطهی زیر را هم داریم:
alpha(x_{i+1}) = alpha(x_i )+ 2 \times n \times (x_{i+1} – x_i)
در ضمن برای نقطهی اول هم میتوانیم از O(n) این دو مقدار را حساب کنیم. پس در کل این الگوریتم از O(n) است. حالا به مسئلهی اصلی بر میگردیم یعنی نقاط میتوانند رنگ یکسان داشته باشند. ما در قسمت قبل تنها استفادهای که از فرض اضافیمان کردیم این بود که محور مختصات را به یکسری بازه تقسیم کردیم که در هر بازه نقاطی که در محاسبه g استفاده میشدند ثابت بودند و جهت یکسانی با عناصر آن بازه داشتند. در مسئلهی اصلی هم چنین افرازی میتوان پیدا کرد. در این حالت به ازای نقطهی وسط هر دو نقطهی همرنگ متوالی هم یک نقطهی فرضی در نظر بگیرید. این نقاط فرضی به همراه نقاط اصلی محور را به تعدادی دسته افراز میکنند که شرط مورد نظر را دارا می باشند و در ضمن تعدادشان از n کمتر است چون ماکسیمم n زوج نقطه داریم که متوالی باشند.(واضح است که اگر روی محور حرکت کنید و جایی نقاط مورد استفاده در محاسبهی g تغییر کنند حتما از یکی از نقاط فرضی یا اصلی گذشتهایم.)پس به همان ترتیب بالا عمل میکنیم. یعنی مجموعهی تمام نقاط اصلی و فرضی را x_1 تا x_n مینامیم و همان الگوریتم قسمت اول را اجرا میکنیم.