practical1.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 − ۱‬را به گونهای بسازیم که ناحسابی باشد‪ .‬جایگشت ) ‪ (p۱ , . . . , pn‬را ناحسابی گوییم هرگاه‬
‫نتوانیم ‪ ۳‬عدد‬
‫‪i<j <k‬‬
‫را به گونهای پیدا کنیم که دنباله‬
‫) ‪(pi , pj , pk‬‬
‫تشکیل یک تصاعد حسابی بدهد‪ .‬برای مثال جایگشت‬
‫)‪ (۲, ۰, ۱, ۴, ۳‬یک جایگشت ناحسابی است اما جایگشت )‪ (۰, ۵, ۴, ۳, ۱, ۲‬یک جایگشت ناحسابی نیست زیرا )‪ (۵, ۳, ۱‬که بههمین‬
‫ترتیب در جایگشت آمدهاند یک تصاعد حسابی تشکیل میدهند‪ .‬حال از شما میخواهیم که با دریافت‬
‫‪n‬‬
‫از ورودی‪ ،‬یک جایگشت‬
‫ناحسابی از اعداد ‪ ۰‬تا ‪ n − ۱‬تولید کنید‪.‬‬
‫ورودی استاندارد‬
‫در هر خط ورودی مقدار ‪ ۳ ≤ n ≤ ۱۰۰۰۰‬دادهشدهاست که شما باید به ازای هر کدام از آنها یک جایگشت ناحسابی تولید کنید‪.‬‬
‫انتهای ورودی با مقدار ‪ ۰‬مشخصشدهاست و شما نباید برای آن خروجی تولید کنید‪.‬‬
‫خروجی استاندارد‬
‫در هر خط خروجی‪ ،‬باید جواب یک تست را )به همان ترتیبی که در ورودی آمدهاند( بنویسید‪ .‬این خط باید شامل ‪ n‬عدد باشد که با‬
‫فاصله از هم جدا شدهاند‪ .‬این اعداد باید جایگشتی ناحسابی از ‪ ۰, . . . , n − ۱‬باشند‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪3‬‬
‫‪1 2 0 3‬‬
‫‪5‬‬
‫‪3 4 1 0 2 5‬‬
‫‪6‬‬
‫‪1 0 5 3 4 2 6‬‬
‫‪0‬‬
‫‪۳‬‬
‫سوال ‪] ۲‬مشکل کفاش[‬
‫به کفاش سوال ما ‪ n‬کار برای انجام دادهشدهاست‪ .‬کفاش در هر روز تنها میتواند به یک کار برسد و هر کاری را که شروع میکند باید‬
‫به انتها برساند‪ .‬میدانیم که کار ‪i‬ام ‪ ۱ ≤ ti ≤ ۱۰۰۰‬روز طول میکشد تا انجام شود‪ .‬همچنین مشتری شماره ‪ i‬به ازای هر روز تاخیری‬
‫که در شروع انجام کارش شود مقدار ‪ ۱ ≤ si ≤ ۱۰۰۰۰‬تومان خسارت میگیرد‪ .‬حال شما به عنوان دوست کفاش باید برنامهای برای او‬
‫بنویسید که ترتیبی از انجام کارها ارائه دهد که در آن کفاش کمترین میزان خسارت را بپردازد‪.‬‬
‫ورودی استاندارد‬
‫در سطر اول ورودی تعداد مسائلی که به شما داده میشود آوردهشدهاست‪ .‬پس از یک خط خالی مسائل به ترتیب آوردهشدهاند‪ .‬در‬
‫سطر اول هر مسئله ‪ ،۱ ≤ n ≤ ۱۰۰۰‬تعداد کارها دادهشدهاست‪ .‬سپس در ‪ n‬خط بعد در هر خط دو عدد که بهترتیب تعداد روزهای‬
‫مورد نیاز برای انجام آن کار و میزان خسارتی که به ازای هر روز تاخیر باید دادهشود آوردهشدهاست‪ .‬بین مسائل مختلف نیز یک خط‬
‫خالی فاصله است‪.‬‬
‫خروجی استاندارد‬
‫در خروجی به ازای هر مسئله ترتیبی از کارها که میزان خسارت را کمینه کند در یک سطر مجزا چاپ کنید‪) .‬شماره کارها همان ترتیبی‬
‫است که در ورودی آمده اند( اگر چند دنباله این خاصیت را داشتند آن دنباله ای را که از نظر ترتیب لغتنامهای اول میآید چاپ کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪4 3 1 2‬‬
‫‪1‬‬
‫‪4‬‬
‫‪4 3‬‬
‫‪1000 1‬‬
‫‪2 2‬‬
‫‪5 5‬‬
‫‪۴‬‬
‫سوال ‪] ۳‬زبالهجمعکن[‬
‫در حیاط خانه شما ‪ n‬واحد زباله جمعشدهاست و شما میخواهید این تعداد را به مقدار ‪ m‬یا کمتر از آن کاهش دهید‪ .‬شما نمیخواهید‬
‫این کار را خود انجام دهید‪ .‬در منطقه شما تعداد ‪ p‬شرکت وجود دارد که کار جمعکردن زبالهها را به عهدهدارند‪ .‬شرکت ‪i‬ام با دریافت‬
‫‪ai‬‬
‫تومان یک واحد از زبالهها را کاهش میدهد و با دریافت ‪ bi‬تومان تعداد زباله را به نصف کاهش میدهد )اگر تعداد زبالهها فرد بود تعداد‬
‫زبالههای باقیمانده به پایین گرد میشود(‪ .‬حال شما میخواهید برنامهای بنویسد که این ‪ p‬شرکت را بر اساس مقدار کمترین پولی که‬
‫باید به آنها بدهید تا زبالههای شما را از ‪ n‬واحد به مقدار کمتر یا مساوی ‪ m‬برساند از کوچک به بزرگ مرتب کنید و نمایش دهید )اگر‬
‫دو شرکت با میزان یکسانی پول کار شما را انجام میدادند آن شرکتی که اسمش از نظر لغتنامهای کوچکتر است اول میآید(‪.‬‬
‫ورودی استاندارد‬
‫در سطر اول ورودی ابتدا تعداد مسائل به شما دادهمیشود‪ .‬در سطرهای بعد به ترتیب مسائل آوردهمیشوند‪ .‬در سطر اول هر مسئاله‬
‫سه عدد ‪ n‬و ‪ m‬و ‪ p‬به ترتیب آوردهشدهاند‪ .‬در ‪ p‬سطر بعد در هر سطر ابتدا نام شرکت )که یک رشته از حروف بزرگ انگلیسی است و‬
‫حداکثر ‪ ۱۶‬حرفی می باشد( آوردهشدهاست‪ .‬هیچ دو شرکتی نام یکسان ندارند‪ .‬بعد از یک عالمت دونقطه به ترتیب ‪ a‬و ‪ b‬آن شرکت‬
‫داده شده است )که ‪ a‬و ‪ b‬به ترتیب مقدار پول دریافتی به ازای کاهش یک واحد زباله و کاهش دادن آن به نصف می باشند(‪.‬‬
‫خروجی استاندارد‬
‫در خروجی به ازای مساله ‪i‬ام ابتدا یک خط با محتوای ”‪ “Case i‬چاپکنید‪ .‬در خطوط بعد شرکتها را بهصورت مذکور چاپکنید‪ .‬در هر‬
‫خط ابتدا نام شرکت و سپس میزان کمترین پولی که باید به آن داد تا زبالهها را به میزانی کمتر یا مساوی ‪ m‬کاهش دهد را چاپ کنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪2‬‬
‫‪Case 1‬‬
‫‪3 5 100‬‬
‫‪C 7‬‬
‫‪A: 1 10‬‬
‫‪B 22‬‬
‫‪B: 2 5‬‬
‫‪A 37‬‬
‫‪C: 3 1‬‬
‫‪Case 2‬‬
‫‪5 1122 1123‬‬
‫‪E 0‬‬
‫‪B: 50 300‬‬
‫‪A 1‬‬
‫‪A: 1 1000‬‬
‫‪D 1‬‬
‫‪C: 10 10‬‬
‫‪C 10‬‬
‫‪D: 1 50‬‬
‫‪B 50‬‬
‫‪E: 0 0‬‬
‫‪۵‬‬
‫سوال ‪] ۴‬رشتههای پیوسته[‬
‫همه رشتههای ‪ n‬حرفی که با کاراکترهای }‪ {۰, . . . , k‬میتوان ساخت را درنظربگیرید‪ .‬تعداد آنها ‪ (k + ۱)n‬است‪ .‬برخی از این رشتهها‬
‫پیوستهاند‪ ،‬به این معنا که هر دو کاراکتر متوالی آنها حداکثر یک واحد اختالف دارند‪ .‬شما باید درصد رشتههای پیوسته به کل رشتهها‬
‫را با دقت دقیقاً ‪ ۵‬رقم اعشار در خروجی چاپ کنید‪.‬‬
‫ورودی استاندارد‬
‫در ورودی تعدادی تست آمده که مشخصات هر تست بهصورت دو عدد ‪ ۱ ≤ n ≤ ۱۰۰‬و ‪ ۰ ≤ k ≤ ۹‬در یک سطر آمده‪ .‬در انتهای‬
‫ورودی یک سطر با دو عدد ‪ ۰‬آمده که انتهای ورودی را مشخص میکند و شما نباید برای آن خروجی چاپ کنید‪.‬‬
‫خروجی استاندارد‬
‫در خروجی برای هر سطر درصد رشتههای پیوسته در کل رشتهها را دقیقاً با ‪ ۵‬رقم اعشار چاپ کنید‪ .‬برای چاپ یک عدد از نوع ‪double‬‬
‫در ‪ C++‬از دستور )‪ printf(“%.5lf\n”,x‬و در ‪ Java‬از دستور )‪ System.out.printf(“%.5f\n”,x‬استفادهکنید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪4 1‬‬
‫‪100.00000‬‬
‫‪2 5‬‬
‫‪40.74074‬‬
‫‪3 5‬‬
‫‪17.38281‬‬
‫‪8 7‬‬
‫‪0.10130‬‬
‫‪۶‬‬
‫سوال ‪] ۵‬کیک کشمشی[‬
‫سارا و دارا سر خوردن یک کیک دعوایشان شده‪ .‬این کیک مستطیلشکل است و به صورت یک جدول ‪ n × m‬دیده میشود‪ .‬روی خانه‬
‫)‪(i, j‬ام این جدول که ‪ ۱ ≤ i ≤ n‬و ‪ ۱ ≤ j ≤ m‬یک کشمش قرار دارد‪ .‬سارا و دارا هر دو به کشمش حساسیت دارند و نمیخواهند آن‬
‫خانه از کیک را بخورند‪.‬‬
‫بعد از مدتی بحث آنها به این توافق رسیدند که یک بازی انجام دهند‪ .‬ابتدا سارا بازی را شروع میکند و به ترتیب نوبت سارا و دارا‬
‫عوض میشود‪ .‬در هر مرحله فرد میتواند کیک را یک برش عمودی یا افقی )فقط از روی خطوط جدول( بدهد و تکهای که شامل‬
‫کشمش نیست را بخورد‪ .‬کسی که خانه کشمشدار به او برسد بازنده است‪.‬‬
‫شما باید تعیین کنید در صورتی که سارا و دارا بهترین بازی خود را انجام دهند سارا میبرد یا دارا‪ .‬اگر هم سارا میبرد او در برش اول‬
‫حداکثر چند خانه کیک را میتواند بخورد بدون آنکه در انتها ببازد‪.‬‬
‫ورودی استاندارد‬
‫در ورودی ابتدا تعداد تستها آمده‪ .‬سپس برای هر تست در یک سطر مجزا چهار عدد ‪ ۱ ≤ n ≤ ۳۰‬و ‪ ۱ ≤ m ≤ ۳۰‬و ‪ ۱ ≤ i ≤ n‬و‬
‫‪ ۱ ≤ j ≤ m‬آمده‪.‬‬
‫خروجی استاندارد‬
‫برای هر تست اگر دارا میبرد فقط بنویسید ”‪ “Dara‬و اگر سارا میبرد بنویسید ”‪ “Sara‬و سپس حداکثر تعداد خانههای کیکی که سارا‬
‫در حرکت اول میتواند بخورد بدون اینکه ببازد را بنویسید‪.‬‬
‫خروجی نمونه‬
‫ورودی نمونه‬
‫‪2‬‬
‫‪Sara 2‬‬
‫‪2 3 1 3‬‬
‫‪Dara‬‬
‫‪11 11 6 6‬‬
‫‪۷‬‬