practical2.pdf

‫تمرین عملی شماره ‪۲‬‬
‫طراحی الگوریتمها‪ ،‬نیمسال اول ‪۸۸-۸۹‬‬
‫نکات کلی‬
‫•‬
‫شما باید بتوانید برنامههایی به یکی از زبانهای ‪ Java‬یا ‪ C++‬بنویسید که مسالههایی که در ادامه میآیند را در زمانی کارا حل‬
‫کنند‪.‬‬
‫•‬
‫برنامههای شما تحویل حضوری خواهند داشت‪ .‬بنابراین باید به برنامه خود مسلط باشید‪.‬‬
‫•‬
‫برای اجرای برنامههای شما محدودیت زمانی و حافظهای وجود دارد‪ .‬محدودیت زمانی شما در حدود چند ده ثانیه و محدودیت‬
‫حافظه در حدود چند ده مگابایت هست‪.‬‬
‫•‬
‫سروری برای تستکردن برنامههای شما آماده خواهد شد که میتوانید به کمک آن برنامه خود را چک کنید‪ .‬تایید درستی برنامه‬
‫شما توسط سرور نشانه گرفتن نمره کامل نیست و نمره نهایی پس از تحویل حضوری دادهخواهد شد‪.‬‬
‫•‬
‫برنامههای شما باید از ورودی استاندارد چیزهایی بخوانند و در خروجی استاندارد چیزهایی بنویسند‪ .‬ورودی استاندارد خود شامل‬
‫توضیحات چند تست مجزا است و خروجیهای مربوط به تستها را باید با همان ترتیب در خروجی استاندارد بنویسید‪.‬‬
‫•‬
‫برای آشنایی شما در ادامه پیادهسازی راهحل یک سوال ساده به هر دو زبان ‪ Java‬و ‪ C++‬آمده‪.‬‬
‫•‬
‫در راهحلهای به زبان ‪ Java‬شما باید فقط یک فایل بنویسید که شامل فقط یک کالس ‪ public‬باشد )میتواند کالسهای غیر‬
‫از ‪ public‬در همان فایل باشد(‪ .‬فایل شما باید همنام کالس ‪ public‬باشد‪ .‬در ضمن کالس ‪ public‬شما باید ‪ main‬داشتهباشد و‬
‫برنامه شما برای اجرا با صدا زدن تابع ‪ main‬شروع خواهد شد‪.‬‬
‫صورت سوال‬
‫شما باید از ورودی ابتدا یک عدد صحیح ‪ T‬که نمایانگر تعداد تستهاست را بخوانید‪ .‬سپس از ‪ T‬سطر بعد‪ ،‬از هر سطر مشخصات یک‬
‫تست را خوانده و جواب آن را در خروجی بنویسید‪.‬‬
‫مشخصات هر تست شامل دو عدد صحیح است‪ .‬جواب تست برابر جمع این دو عدد است‪.‬‬
‫در ادامه دو پیادهسازی صحیح راهحل این سوال آمدهاند‪.‬‬
‫‪۱‬‬
Java ‫پیادهسازی به زبان‬
import java . u t i l . ∗ ;
import java . io . ∗ ;
public class Solution {
p u b l i c s t a t i c v o i d main ( S t r i n g [ ]
args ) throws IOException {
S c a n n e r s c a n n e r=new S c a n n e r ( System . i n ) ;
i n t T=s c a n n e r . n e x t I n t ( ) ;
f o r ( i n t t e s t =0; t e s t <T ; t e s t ++){
i n t a=s c a n n e r . n e x t I n t ( ) ;
i n t b=s c a n n e r . n e x t I n t ( ) ;
System . o u t . p r i n t l n ( a+b ) ;
}
}
}
C++ ‫پیادهسازی به زبان‬
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ;
i n t main ( ) {
int T;
c i n >>T ;
f o r ( i n t t e s t =0; t e s t <T ; t e s t ++){
int a , b ;
c i n >>a>>b ;
c o u t <<a+b<<e n d l ;
}
return 0;
}
2
‫سوال ‪] ۱‬برنامه نویس دوره گرد[‬
‫شایان برنامهنویس دورهگردی است که با مسافرت به شهرهای مختلف مشکالت برنامهنویسی مردم را برطرف میکند! او میخواهد از‬
‫یک شهر شروع به حرکت کند و تمام شهرها را مالقات کرده و به شهر مبدا برگردد‪ .‬مسئله این است که او میخواهد کوتاهترین دور‬
‫ممکن را انتخاب کند‪ .‬نقشه کشور شایان به صورت یک گراف کامل وزندار در ورودی به شما داده میشود‪.‬‬
‫ورودی استاندارد‬
‫ورودی شامل تعدادی تست است که هر کدام بهصورت زیر داده میشوند‪.‬‬
‫در خط اول عدد ‪ ۳ ≤ n ≤ ۲۵‬و در ‪ n − ۱‬خط بعد نیمه پایین ماتریس مجاورت گراف با وزنهای صحیح بین ‪ ۰‬و ‪ ۱۰۰۰۰‬داده میشود‪.‬‬
‫انتهای ورودی با یک ‪ ۰‬مشخص میشود که شما برای آن ‪ ۰‬کاری نباید انجام دهید‪.‬‬
‫خروجی استاندارد‬
‫شما باید در خروجی برای هر تست در خط اول طول دور مینیمم و در خط بعد ‪ n‬عدد که ترتیب مالقات شهرها را نشان میدهند چاپ‬
‫کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪1 2 3‬‬
‫‪1 1‬‬
‫‪22‬‬
‫‪4‬‬
‫‪1 4 2 3‬‬
‫‪10‬‬
‫‪10 1‬‬
‫‪1 10 10‬‬
‫‪0‬‬
‫‪۳‬‬
‫سوال ‪] ۲‬جادهسازی[‬
‫نیما جادهساز مشهوریست‪ .‬او بهتازگی ماموریتیافته که تعدادی جادهی جدید درست کند بهطوریکه بتوان از هر شهر به هر شهر‬
‫دیگر با استفاده از یک یا تعدادی جاده رسید‪ .‬او میخواهد بهنحوی این جادهها را بکشد که مجموع طول جادههای جدید مینیمم باشد‪.‬‬
‫برنامهای بنویسید که این مقدار مینیمم را حساب کند‪ .‬شهرهای کشور نیما در صفحه مختصات قرار دارند و در ابتدای کار تعدادی جاده‬
‫که از قدیم مانده وجود دارد‪ .‬همچینین اگر دو جاده با هم تقاطع داشته باشند نمی توان در آن تقاطع جاده را عوض کرد )میتوانید‬
‫فرض کنید که جادهها هوایی هستند و هیچ دو جادهای تقاطع ندارند‪(.‬‬
‫ورودی استاندارد‬
‫ورودی شامل تعدادی تست میباشد‪ .‬در سطر اول ورودی ابتدا تعداد تستها آمدهاست و پس از آن تستها بهترتیب داده میشوند‪.‬‬
‫در سطر اول هر تست عدد ‪ ۱ ≤ n ≤ ۵۰۰۰‬آمده که نشانگر تعداد شهرها میباشد‪ .‬در ‪ n‬سطر بعد در هر سطر دو عدد صحیح آمده که‬
‫مختصات شهر ‪ i‬میباشد‪ .‬پس از آن در خط بعد ‪ ۰ ≤ m ≤ ۵۰۰۰۰۰‬آمده که تعداد جادههای از قدیم بهجامانده است‪ .‬سپس در‬
‫‪m‬‬
‫خط بعد در هر خط شماره شهرهای دو سر یکی از این جادهها میآید )شماره شهرها بین ‪ ۱‬و ‪ n‬هستند(‪.‬‬
‫خروجی استاندارد‬
‫برای هر تست در خروجی در یک خط شما باید کمترین طول ممکن برای همبند سازی این کشور را با دقت دو رقم اعشار بدهید‪ .‬برای چاپ‬
‫یک عدد از نوع ‪ double‬در ‪ C++‬از دستور )‪ printf(“%.2lf\n”,x‬و در ‪ Java‬از دستور‬
‫استفادهکنید‪.‬‬
‫‪۴‬‬
‫)‪System.out.printf(“%.2f\n”,x‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪2 1 3 4‬‬
‫‪4.41‬‬
‫‪2‬‬
‫‪4.41‬‬
‫‪4‬‬
‫‪103 104‬‬
‫‪104 100‬‬
‫‪104 103‬‬
‫‪100 100‬‬
‫‪1‬‬
‫‪4 2‬‬
‫‪4‬‬
‫‪103 104‬‬
‫‪104 100‬‬
‫‪104 103‬‬
‫‪100 100‬‬
‫‪1‬‬
‫‪4 2‬‬
‫‪۵‬‬
‫سوال ‪] ۳‬جداکننده[‬
‫گراف جهتداری با‬
‫‪n‬‬
‫راس و‬
‫‪m‬‬
‫یال دادهشدهاست‪ .‬میخواهیم تعدادی از یالهای این گراف را حذف کنیم بهطوریکه هیچ مسیر‬
‫جهتداری از راس ‪ ۱‬به راس ‪ n‬وجود نداشتهباشد‪ .‬هزینه حذف کردن یالها با هم متفاوت است و در ورودی به شما داده میشود‪ .‬شما‬
‫باید این کار را با کمترین هزینه انجام دهید و این کمترین هزینه را در خروجی چاپ کنید‪.‬‬
‫ورودی استاندارد‬
‫ورودی شامل تعدادی تست میباشد‪ .‬در سطر اول ورودی ابتدا تعداد تستها آمدهاست و پس از آن تستها بهترتیب داده میشوند‪.‬‬
‫در ابتدای هر تست ‪ ۲ ≤ n ≤ ۱۰۰۰‬و ‪ ۰ ≤ m ≤ ۱۰۰۰۰۰‬بهترتیب آمدهاند‪ .‬در ‪ m‬سطر بعد در هر سطر مشخصات یک یال آمده که‬
‫دو عدد اول دو سر آن یال را مشخص می کند و عدد سوم هزینهی حذف آن را‪.‬‬
‫خروجی استاندارد‬
‫در خروجی بهازای هر تست کمترین مقدار هزینه را در یک سطر جدا چاپ کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪6‬‬
‫‪1‬‬
‫‪5 5‬‬
‫‪1 2 4‬‬
‫‪1 3 5‬‬
‫‪2 4 6‬‬
‫‪3 4 3‬‬
‫‪4 5 6‬‬
‫‪۶‬‬
‫سوال ‪] ۴‬رنگزنی[‬
‫تعداد ‪ n‬توپ در یک ردیف دادهشدهاست‪ .‬میخواهیم تعدادی از این توپها را رنگ کنیم بهنحویکه بین هر ‪ m‬توپ متوالی حداقل‬
‫دو تا از آنها رنگ شدهباشند‪ .‬هزینهی رنگکردن توپ ‪ i‬ام ‪ ci‬میباشد‪ .‬میخواهیم بهنحوی این کار را انجام دهیم که مجموع هزینه‬
‫رنگکردن مینیمم شود‪.‬‬
‫ورودی استاندارد‬
‫ورودی شامل تعدادی تست می باشد‪ .‬در سطر اول ورودی ابتدا تعداد تستها آمدهاست و پس از آن تستها بهترتیب داده میشوند‪.‬‬
‫در سطر اول هر تست دو عدد ‪ ۲ ≤ n ≤ ۱۰۰۰۰‬و ‪ ۲ ≤ m ≤ ۱۰۰‬آمدهاست‪ .‬در سطر بعد ‪ n‬عدد آمده که عدد ‪i‬ام هزینه رنگکردن‬
‫توپ ‪ (ci ) i‬می باشد‪.‬‬
‫خروجی استاندارد‬
‫در خروجی به ازای هر تست مینیمم هزینه رنگکردن توپها را در یک سطر مجزا چاپ کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪9‬‬
‫‪1‬‬
‫‪6 3‬‬
‫‪1 5 6 2 1 3‬‬
‫‪۷‬‬
‫سوال ‪] ۵‬گراف خطرناک[‬
‫گرافی جهتدار با ‪ n‬راس و ‪ m‬یال به ما دادهشدهاست‪ .‬روی هر کدام از یالهای این گراف جهتدار دو عدد نوشتهشده که یکی طول آن‬
‫یال و دیگری درجه خطر آن یال میباشد‪ .‬شما باید یک مسیر جهتدار از راس ‪ ۱‬به راس ‪ n‬پیدا کنید بهطوریکه طول مسیر از ‪ L‬کمتر‬
‫باشد و درجه خطر آن )بیشترین درجه خطر یالهای آن مسیر( مینیمم باشد‪.‬‬
‫ورودی استاندارد‬
‫ورودی شامل تعدادی تست می باشد‪ .‬در سطر اول ورودی ابتدا تعداد تستها آمدهاست و پس از آن تستها به ترتیب داده میشوند‪.‬‬
‫در سطر اول هر تست به ترتیب ‪ ۱ ≤ n ≤ ۱۰۰‬و ‪ ۰ ≤ m ≤ ۱۰۰۰۰‬و ‪ ۱ ≤ L ≤ ۱۰۰۰۰۰۰‬دادهشدهاست‪ .‬در ‪ m‬سطر بعد در هر‬
‫سطر مشخصات یک یال آمدهاست که به ترتیب شمارهی رئوس دو سر آن یال و بعد از آن طول و درجه خطر آن آمدهاست‪.‬‬
‫خروجی استاندارد‬
‫به ازای هر تست در خروجی در یک سطر یک عدد به عنوان کمترین درجه خطر ممکن و در سطر بعدی شماره راسهای مسیر را‬
‫بهترتیب چاپ کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪1‬‬
‫‪5‬‬
‫‪3 3 10‬‬
‫‪1 2 3‬‬
‫‪1 2 3 4‬‬
‫‪2 3 5 5‬‬
‫‪1 3 11 2‬‬
‫‪۸‬‬