PR4_second_version.pdf

‫به نام خدا‬
‫درس‬
‫ساختمان داد ‌هها و الگوریتم ها‬
‫)سال تحصیلی ‪ ، ۹۰-۸۹‬ترم ‪(۲‬‬
‫استاد‬
‫دکتر محمد علی آبام‬
‫دستیاران استاد‬
‫اشکان نوروزی‬
‫احسان امام جمعه زاده‬
‫پروژه‬
‫چهار‬
‫خها‬
‫مهلت ارسال پاس ‌‬
‫پایان روز ‪ ۱۱‬خرداد‬
‫سلم‬
‫لطفْا توضیحات زیر را با دقت بخوانید‪:‬‬
‫✗‬
‫یتوانید به زبان سی پلس پلس و یا جاوا بنویسید‪.‬‬
‫برنامه های خود را م ‌‬
‫✗‬
‫نگونه که در متن سؤال گفته شده‪ ،‬به برنامه ی شما داده می شود‪ .‬خروجی شما نیز باید دقیق ْا به همان فرمتی باشد که در‬
‫ورودی هر برنامه‪ ،‬دقیقْا هما ‌‬
‫متن سؤال گفته شده است‪.‬‬
‫✗‬
‫مهم‪ :‬شیوه ی ارسال پروژه‪:‬‬
‫ برنام‌ههای خود را در پوشه ای به نام ‪ StdID_PR4‬بریزید )البته به جای ‪ ، StdID‬شماره ی دانشجویی خود را قرار دهید!( سپس این پوشه را‬‫فشرده کنید‪ .‬در نهایت‪ ،‬فایل ‪ StdID_PR4.zip‬را به آدرس ‪ [email protected]‬ارسال نمایید‪ .‬دقت کنید که عنوان ایمیلتان باید‬
‫‪ PR4‬باشد‪.‬‬
‫ علوه بر ارسال پروژه ها به آدرس گفته شده‪ ،‬باید برنام‌ههای خود را به آربیتر ) ‪ ( http://acm.sharif.edu/arbiter‬نیز ارسال نمایید‪ .‬آربیتر به‬‫صورت آنلین برنام‌ههای شما را تست کرده و نتیجه را به شما گزارش می کند‪) .‬البته نتیج‌های که آربیتر به شما گزارش می کند‪ ،‬نتیجه ی نهایی پروژه تان‬
‫نیست!(‬
‫تذکر‪ :‬در آربیتر‪ ،‬نام کاربری شما باید به فرم ‪ ds88888888‬باشد که در آن به جای ‪ ، ۸۸۸۸۸۸۸۸‬شماره ی دانشجویی قرار می گیرد‪.‬‬
‫✗‬
‫اگر درباره ی پروژه ها سؤالی داشتید‪ ،‬به ‪ [email protected]‬ایمیل بزنید‪.‬‬
‫‪SecondWar.java‬‬
‫‪,‬‬
‫‪SecondWar.cpp‬‬
‫داستان جنگ بین دو کشور ‪ A‬و ‪ B‬را که به خاطر دارید؟! اکنون بعد از گذشت یک نسل‪ ،‬این دو کشور دوباره به جنگ یکدیگر می روند‪ ،‬ولی این بار به سبکی‬
‫نوین!‬
‫یگرفتند چه کسی را برای نبرد تن به تن به‬
‫نگونه که به یاد دارید‪ ،‬در دور قبلی مبارزات‪ ،‬استراتژی هر دو سپاه به گون‌های بود که در طول جنگ باید تصمیم م ‌‬
‫هما ‌‬
‫میدان بفرستند‪) .‬در هر مرحله از جنگ‪ ،‬نیرومندترین سرباز ‪ A‬با کم نیروترین سرباز ‪ B‬می جنگید‪(.‬‬
‫چون این کار )یعنی انتخاب سرباز برای هر مرحله از جنگ(‪ ،‬کار دشواری بود )و به داده ساختار ‪ heap‬نیاز داشت!(‪ ،‬این بار هر دو سپاه تصمیم گرفتند که‬
‫ترتیب ورود سربازان به میدان نبرد را از پیش تعیین کنند تا در حین جنگ‪ ،‬برای انتخاب افراد‪ ،‬زمان زیادی مصرف نشود!‬
‫یشود‪:‬‬
‫در این سری از مبارزات هم‪ ،‬نتیجه ی هر نبرد تن به تن‪ ،‬مشابه قبل تعیین م ‌‬
‫–‬
‫اگر نیروی دو سرباز برابر باشد‪ ،‬هر دو می میرند!‬
‫–‬
‫یمیرد و سرباز دیگر‪ ،‬با نیرویی برابر با نصف نیروی قبلی خود‪ ،‬به زندگی ادامه‬
‫اگر نیروی یکی بیش تر از دیگری باشد‪ ،‬سربازی که نیروی کم تری دارد‪ ،‬م ‌‬
‫‪k‬‬
‫می دهد‪) .‬به بیان دقیق تر‪ ،‬اگر نیرویش پیش از نبرد تن به تن‪ ،‬برابر ‪ k‬بوده‪ ،‬پس از این نبرد‪ ،‬مقدار نیرویش برابر ] [‬
‫‪2‬‬
‫خواهد بود‪(.‬‬
‫اگر در یک نبرد تن به تن‪ ،‬سربازی بمیرد‪ ،‬برای نبرد تن به تن بعدی‪ ،‬سرباز بعدی آن سپاه وارد میدان می شود‪ .‬ولی سربازی که پس از یک نبرد تن به تن زنده‬
‫می ماند‪ ،‬خودش در نبرد بعدی حضور خواهد داشت‪) .‬در واقع‪ ،‬سربازی که به میدان آمده است‪ ،‬تا زمانی که زنده است‪ ،‬در میدان می ماند‪(.‬‬
‫استراتژی نظامی این دو سپاه‪ ،‬یک تغییر دیگر هم داشت! این بار‪ ،‬هر سرباز‪ ،‬یک » رشته ی رمز « هم دارد! در یک سپاه‪ ،‬رشته ی رمز هیچ دو سربازی برابر‬
‫نیست‪.‬‬
‫در هر یک از این دو سپاه‪ ،‬وقتی سربازی کشته می شود‪ ،‬همه ی سربازانی که رمز فرد کشته شده‪ ،‬پیشوند رمزشان بوده‪ ،‬فرار می کنند!‬
‫ل فرض کنید در یک سپاه‪ ۴ ،‬سرباز با رمزهای ‪ abc ، abb ، ab‬و ‪ bb‬زنده مانده اند‪ .‬در چنین سپاهی‪ ،‬در صورت کشته شدن ‪ ، ab‬این دو سرباز‬
‫مث ْ‬
‫یکنند ‪ abb :‬و ‪) abc‬چون رشته ی ‪ ، ab‬پیشوند این دو رشته است‪(.‬‬
‫هم فرار م ‌‬
‫یتواند سربازان فراریش را مرده به حساب آورد!( پس اگر در یک زمان‪ ،‬سربازی که‬
‫بدیهی است سربازان فرار کرده‪ ،‬دیگر به جنگ نخواهند آمد‪) .‬در واقع هر سپاه م ‌‬
‫قرار بود وارد میدان شود‪ ،‬فرار کرده بود‪ ،‬سرباز بعدی آن سپاه به میدان خواهد آمد‪.‬‬
‫پایان جنگ ‪:‬‬
‫یمانده است‪ ،‬سپاهی که دیگر‬
‫مانند سری قبلی جنگ ها‪ ،‬اگر سربازان یکی از سپاه ها تمام شدند‪ ،‬در حالی که هنوز از سپاه دیگر‪ ،‬سربازی باق ‌‬
‫تخورده محسوب می شود‪) .‬در صورتی که سربازان هر دو سپاه‪ ،‬دقیقْا همزمان تمام شدند‪ ،‬جنگ پیروزی نداشته است‪(.‬‬
‫سربازی ندارد‪ ،‬شکس ‌‬
‫ورودی‪:‬‬
‫در نخستین خط ورودی‪ ،‬عدد ‪) m‬تعداد سربازان کشور ‪ ( A‬آمده است و در ‪ m‬خط بعدی‪ ،‬نیروی اولیه تک تک سربازان این کشور به همراه رمزشان‬
‫سپس عدد ‪) n‬تعداد سربازان کشور ‪ ( B‬و در ‪ n‬خط بعد از آن‪ ،‬نیروی اولیه ی تک تک سربازان کشور ‪ B‬به همراه رمزشان‪.‬‬
‫برای هر یک از این دو سپاه‪ ،‬سربازان به ترتیبی که قرار است وارد میدان نبرد شوند‪ ،‬در ورودی داده شده اند‪.‬‬
‫نیروهای اولیه‪ ،‬همگی اعداد طبیعی هستند و در متغیر های ‪ ۴‬بایتی صحیح ) ‪ ( int‬جا می شوند‪ .‬رمزها هم همگی تنها از حروف ‪ a‬و ‪ b‬و ‪ c‬و ‪ d‬ساخته‬
‫شد‌هاند و طول هر کدامشان حداکثر ‪ ۲۰‬کارکتر است‪.‬‬
‫خروجی‪:‬‬
‫–‬
‫اگر جنگ برنده ای نداشته است‪ ،‬در تنها خط خروجی‪ ،‬یک ‪ 0‬بنویسید‬
‫–‬
‫یمانده برای سربازان کشور پیروز و در خط بعدی‪ ،‬نام کشور پیروز را‬
‫اگر جنگ برنده داشته است‪ ،‬در نخستین خط خروجی‪ ،‬مجموع نیروهای باق ‌‬
‫بنویسید‪.‬‬
‫محدودیت ها‪:‬‬
‫‪0  m , n ≤ 200, 000‬‬
‫نیروهای اولیه‪ ،‬همگی اعداد طبیعی هستند و در متغیر های ‪ ۴‬بایتی صحیح ) ‪ ( int‬جا می شوند‪.‬‬
‫رمزها هم همگی از حروف ‪ a‬و ‪ b‬و ‪ c‬و ‪ d‬تشکیل شد‌هاند و طول هر رمز‪ ،‬حداکثر ‪ ۲۰‬کارکتر است‪.‬‬
‫محدودیت حافظه هر تست ‪ 6۴ :‬مگابایت‬
‫محدودیت زمانی هر تست ‪ ۴ :‬ثانیه برای سی پلس پلس ‪ 6 ،‬ثانیه برای جاوا‬
‫‪sample input :‬‬
‫‪4‬‬
‫‪1 ab‬‬
‫‪100 abb‬‬
‫‪1000 abc‬‬
‫‪10 bb‬‬
‫‪3‬‬
‫‪4 abcd‬‬
‫‪8 abc‬‬
‫‪4 ab‬‬
‫‪sample output :‬‬
‫‪8‬‬
‫‪B‬‬
‫نمره ی این سوال‪ ،‬به عنوان نمره ی اضافی در نظر گرفته می شود‪.‬‬
‫‪Game.java‬‬
‫‪,‬‬
‫‪Game.cpp‬‬
‫‪ n‬کارت به ترتیب روی میز چیده شد‌هاند و در ابتدا روی هر یک از کارت ها‪ ،‬یک عدد صحیح نا منفی نوشته شده است‪.‬‬
‫یشود که در هر مرحله از بازی‪:‬‬
‫یک بازی دو نفره به این صورت انجام م ‌‬
‫ینویسد )این عدد ممکن است‬
‫یکند و عدد صحیح دلخواهی روی آن م ‌‬
‫یکند‪ ،‬عدد روی کارت را پاک م ‌‬
‫ابتدا نفر اول‪ ،‬ابتدا یکی از کارت ها را به دلخواه انتخاب م ‌‬
‫منفی باشد!(‬
‫سپس یک عدد طبیعی ‪ i‬اعلم می کند‪.‬‬
‫یکند باید ناصفر‬
‫اکنون نوبت بازی نفر دوم است‪ .‬نفر دوم باید از بین ‪ i‬کارت اول‪ ،‬تعداد ناصفری کارت مجاور انتخاب کند‪) .‬تعداد کارت هایی که انتخاب م ‌‬
‫باشد‪(.‬‬
‫امتیازی که نفر دوم از این مرحله می گیرد‪ ،‬برابر است با مجموع اعداد نوشته شده بر روی این کارت ها‪.‬‬
‫این کار ‪ m‬بار تکرار می شود‪ .‬در پایان بازی‪ ،‬امتیاز نفر دوم برابر است با مجموع امتیازی که در ‪ m‬مرحله گرفته است‪.‬‬
‫به نفر دوم کمک کنید تا بیش ترین امتیاز ممکن را بگیرد‪.‬‬
‫ورودی‪:‬‬
‫در نخستین خط ورودی‪ ،‬عدد ‪) n‬تعداد کارت ها( آمده است و سپس در خط بعدی ‪ n‬عدد صحیح نامنفی که بیان گر اعداد اولیه ی روی کارت ها هستند‪.‬‬
‫سپس در خط بعدی عدد ‪) m‬تعداد مراحل بازی( آمده است‪ .‬در ‪ m‬خط بعدی‪ ،‬در هر خط‪ ،‬سه عدد ‪ p‬و ‪ q‬و ‪ i‬آمده اند‪ p .‬و ‪ q‬بیان گر این هستندکه‬
‫نفر اول‪ ،‬عدد ‪ p‬امین کارت را به ‪ q‬تبدیل کرده‪ .‬عدد ‪ i‬هم که در متن سؤال توضیح داده شده است‪.‬‬
‫یتواند صفر باشد‪.‬‬
‫تعداد کارت هایی که نفر دوم در یک مرحله انتخاب می کند‪ ،‬نم ‌‬
‫خروجی‪:‬‬
‫یتواند در طول بازی به دست آورد‪ ،‬بنویسید‪.‬‬
‫در تنها خط خروجی‪ ،‬حداکثر امتیازی را که نفر دوم م ‌‬
‫محدودیت ها‪:‬‬
‫‪ 0  n ≤ 2∗105‬و ‪0 ≤ m ≤10‬‬
‫اعداد روی کارت ها نیز همواره در بازه ی ] ‪ [ −10 6 , 106‬قرار دارند‪.‬‬
‫‪5‬‬
‫محدودیت حافظه هر تست ‪ 6۴ :‬مگابایت‬
‫محدودیت زمانی هر تست ‪ ۴ :‬ثانیه برای سی پلس پلس ‪ 6 ،‬ثانیه برای جاوا‬
‫‪sample input :‬‬
‫‪5‬‬
‫‪10 20 20 100 30‬‬
‫‪2‬‬
‫‪2 -1000 3‬‬
‫‪4 -10 5‬‬
‫‪sample output :‬‬
‫‪60‬‬
‫یکند و ‪ ۲۰‬امتیاز می گیرد‪ .‬سپس در مرحله ی بعدی‪ ،‬کارت های سوم و چهارم و پنجم را‬
‫توضیح خروجی نمونه ‪ :‬بازیکن دوم‪ ،‬در مرحله ی اول بازی‪ ،‬سومین کارت را انتخاب م ‌‬
‫یکند و ‪ ۴۰‬امتیاز می گیرد‪( 20  −10  30 = 40 ) .‬‬
‫انتخاب م ‌‬