تمرین عملی شماره ۱ ساختمان دادهها ،نیمسال اول ۸۸-۸۹ نکات کلی • شما باید بتوانید برنامههایی به یکی از زبانهای 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 ۷
© Copyright 2025 Paperzz