proje2.pdf

‫ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟ‬
‫ﻣﺒﺎﻧ ﺳﺎﺧﺘﻤﺎن دادهﻫﺎ و اﻟ ﻮرﯾﺘﻢﻫﺎ )‪(۴٠-٢۵۴‬‬
‫‪Introduction to Data Structures and Algorithms‬‬
‫داﻧﺸ ﺪهی ﻣﻬﻨﺪﺳ ﮐﺎﻣﭙﯿﻮﺗﺮ‬
‫ﻣﺪرس‪ :‬ﻣﺤﻤﺪ ﻋﻠ آﺑﺎم‬
‫ﻣﻮﻋﺪ ارﺳﺎل‪ ٣٠ :‬ﻓﺮوردﯾﻦ ‪١٣٩١‬‬
‫ﺗﻤﺮﯾﻦ ﻋﻤﻠ ‐ ﺷﻤﺎرهی ‪٢‬‬
‫• در ﺗﻤﺎم ﺳﻮاﻻت ﻣﺤﺪودﯾﺖ زﻣﺎﻧ ‪ ٣‬ﺛﺎﻧﯿﻪ و ﻣﺤﺪودﯾﺖ ﺣﺎﻓﻈﻪ ‪ ٢٠‬ﻣ ﺎﺑﺎﯾﺖ ﻣ ﺑﺎﺷﺪ‪.‬‬
‫• ﺟﻮاب ﺗﻤﺮﯾﻦﻫﺎ را ﻣ ﺑﺎﯾﺴﺖ از ﻃﺮﯾﻖ ﺳﺎﻣﺎﻧﻪی ﺑﺮﺧﻂ ‪ http://learn.inoi.ir‬ارﺳﺎل ﮐﻨﯿﺪ‪.‬‬
‫• ﻧﺎم ﮐﺎرﺑﺮی ﺷﻤﺎ در ﺳﺎﻣﺎﻧﻪی ﺑﺮﺧﻂ ﺷﻤﺎرهی داﻧﺸﺠﻮﯾﯽ ﺷﻤﺎ ﻣ ﺑﺎﺷﺪ‪ .‬ﺗﻨﻬﺎ از اﯾﻦ ﻧﺎم ﮐﺎرﺑﺮی اﺳﺘﻔﺎده ﮐﻨﯿﺪ‪.‬‬
‫• ﺑﺮﻧﺎﻣﻪﻫﺎی ارﺳﺎﻟ ﻣ ﺑﺎﯾﺴﺖ ﺑﻪ ﯾ‬
‫ﯾ‬
‫از ‪ ٣‬زﺑﺎن ‪ C++ ،C‬ﯾﺎ ‪ Java‬ﺑﺎﺷﻨﺪ‪ .‬دﻗﺖ ﮐﻨﯿﺪ ﮐﻪ ﺑﺎﯾﺪ ﺳﻮرس ﺑﺮﻧﺎﻣﻪ را ﮐﻪ ﺗﻨﻬﺎ در‬
‫ﻓﺎﯾﻞ آﻣﺪه اﺳﺖ ارﺳﺎل ﮐﻨﯿﺪ و از ارﺳﺎل ﻣﺠﻤﻮﻋﻪ ﻓﺎﯾﻞ ﯾﺎ ‪ zip‬ﺷﺪهی آنﻫﺎ ﺧﻮدداری ﻧﻤﺎﯾﯿﺪ‪ .‬ﻓﺎﯾﻞﻫﺎی ارﺳﺎﻟ ﺑﻪ‬
‫زﺑﺎن ‪ Java‬ﻣ ﺑﺎﯾﺴﺖ ﺗﻨﻬﺎ ﺷﺎﻣﻞ ﯾ‬
‫ﮐﻼس ‪ public‬و دﻗﯿﻘﺎ ﺑﺎ ﻧﺎم ‪ prog‬ﺑﺎﺷﻨﺪ‪.‬‬
‫• ﺗﻤﺎم ﻓﺎﯾﻞﻫﺎی ارﺳﺎﻟ ﺑﻪ ﺳﺎﻣﺎﻧﻪی داوری در اﻧﺘﻬﺎ ﻣﻮرد ﺑﺮرﺳ ﺗﻘﻠﺐ ﻗﺮار ﺧﻮاﻫﻨﺪ ﮔﺮﻓﺖ‪ .‬اﻣ ﺎن ﮐﺸﻒ ﺗﻘﻠﺐ ﺣﺘ ﺑﺎ‬
‫ﺗﻐﯿﯿﺮات ﺑﺴﯿﺎر ﻧﯿﺰ ﺗﻮﺳﻂ اﺑﺰارﻫﺎی ﻣﻮﺟﻮد اﻣ ﺎنﭘﺬﯾﺮ اﺳﺖ‪ .‬ﺗﻮﺻﯿﻪ ﻣ ﺷﻮد اﮐﯿﺪا از اﯾﻦ اﻣﺮ ﺧﻮدداری ﮐﻨﯿﺪ‪.‬‬
‫‪١‬‬
‫رزم آﺧﺮ‬
‫دو ﮐﺸﻮر ﺳﯿﺎهﺟﺎﻣ ﺎن و ﺳﻔﯿﺪﺟﺎﻣ ﺎن ﮐﻪ ﺳﺎﻟﻬﺎﺳﺖ در ﺣﺎل ﻧﺒﺮد ﺑﺎ ﯾ ﺪﯾ ﺮﻧﺪ‪ ،‬ﺗﺼﻤﯿﻢ ﮔﺮﻓﺘﻪ اﻧﺪ ﮐﻪ ﺑﺎﻻﺧﺮه ﻧﺘﯿﺠﻪ ﺟﻨﮓ را‬
‫ﺑﺎ ﻧﺒﺮد ﺗﻦ ﺑﻪ ﺗﻦ ﻣﻌﻠﻮم ﮐﻨﻨﺪ‪.‬‬
‫ﻣﺮاﺳﻢ ﻧﺒﺮد ﺗﻦ ﺑﻪ ﺗﻦ ﮐﻼ ﺑﻪ اﯾﻦ ﺻﻮرت اﺳﺖ ﮐﻪ ﻫﺮ ﮐﺸﻮر ﺗﻌﺪادی از ﻗﻮیﺗﺮﯾﻦ ﺟﻨﮓ ﺟﻮﯾﺎن ﺧﻮد را در آن روز ﺑﻪ ﻣﯿﺪان ﻣ‬
‫آورد‪ .‬در ﻫﺮ ﻣﺮﺣﻠﻪ‪ ،‬رزﻣ ﺑﯿﻦ ﻗﻮی ﺗﺮﯾﻦ ﺟﻨﮓ ﺟﻮی ﺑﺎﻗ ﻣﺎﻧﺪه از ﮐﺸﻮر ﺳﯿﺎه ﺟﺎﻣ ﺎن و ﻗﻮی ﺗﺮﯾﻦ ﺟﻨﮓ ﺟﻮی ﺑﺎﻗ ﻣﺎﻧﺪه از‬
‫ﮐﺸﻮر ﺳﻔﯿﺪﺟﺎﻣ ﺎن ﺻﻮرت ﻣ ﮔﯿﺮد‪.‬ﻫﺮ ﺟﻨﮓ ﺟﻮ ﻗﺪرﺗ دارد ﮐﻪ ﺑﺎ اﺳﺘﻔﺎده از آن ﻣ ﺗﻮان ﻓﻬﻤﯿﺪ ﮐﻪ ﻗﻮیﺗﺮﯾﻦ ﺟﻨﮓ ﺟﻮی‬
‫ﺑﺎﻗ ﻣﺎﻧﺪه ﮐﯿﺴﺖ‪ .‬اﮔﺮ در ﯾ‬
‫رزم‪ ،‬ﺟﻨﮓ ﺟﻮﯾﯽ ﺑﺎ ﻗﺪرت ‪ P‬ﺑﺎ ﺟﻨﮓ ﺟﻮﯾﯽ ﺑﺎ ﻗﺪرت ‪ Q‬دراﻓﺘﺪ ﺑﻪ ﻃﻮری ﮐﻪ ‪ P > Q‬ﺑﺎﺷﺪ‪،‬‬
‫ﺟﻨﮓ ﺟﻮی ﺑﺎ ﻗﺪرت ‪ Q‬ﮐﺸﺘﻪ ﺷﺪه و ﻗﺪرت ﺟﻨﮓ ﺟﻮی دﯾ ﺮ ﻧﯿﺰ ﺑﻪ اﻧﺪازه ‪ Q‬ﮐﺎﻫﺶ ﻣ ﯾﺎﺑﺪ‪ .‬در ﻧﻬﺎﯾﺖ ﮐﺸﻮری ﺑﺎزﻧﺪه اﺳﺖ‬
‫ﮐﻪ ﻫﯿﭻ ﯾ‬
‫از ﺟﻨﮓ ﺟﻮﯾﺎﻧﺶ زﻧﺪه ﻧﻤﺎﻧﻨﺪ‪) .‬اﮔﺮ ﻗﺪرت ﻫﺮ دو ﺟﻨﮕﺠﻮ ﺑﺮاﺑﺮ ﺑﺎﺷﺪ ﻫﺮ دو در اﯾﻦ ﻧﺒﺮد ﺗﻠﻒ ﻣ ﺷﻮﻧﺪ‪(.‬‬
‫ﺣﺎل ﻣﺎ ﻣ ﺧﻮاﻫﯿﻢ ﻗﺒﻞ از اﯾﻦ ﮐﻪ ﻧﺒﺮد آﻏﺎز ﺷﻮد‪ ،‬ﻣﺘﻮﺟﻪ ﺷﻮﯾﻢ ﮐﻪ ﭼﻪ ﮐﺸﻮری ﭘﯿﺮوز ﻣﯿﺪان اﺳﺖ‪.‬‬
‫ورودی‬
‫در ﺧﻂ اول ورودی‪ ،N ،‬ﺗﻌﺪاد ﺟﻨﮓ ﺟﻮﯾﺎن ﮐﺸﻮر ﺳﻔﯿﺪ ﺟﺎﻣ ﺎن آﻣﺪه اﺳﺖ‪ .‬در ﺧﻂ ﺑﻌﺪ‪ N ،‬ﻋﺪد ﺻﺤﯿﺢ ﻣﺜﺒﺖ آﻣﺪه ﮐﻪ‬
‫ﻋﺪد ‪i‬ام‪ ،Pi ،‬ﻧﺸﺎن دﻫﻨﺪه ﻗﺪرت ﺟﻨﮓ ﺟﻮی ‪i‬ام از ﮐﺸﻮر ﺳﻔﯿﺪﺟﺎﻣ ﺎن اﺳﺖ‪ .‬ﺳﭙﺲ در ﺧﻂ ﺳﻮم‪ ،M ،‬ﺗﻌﺪاد ﺟﻨﮓ ﺟﻮﯾﺎن‬
‫ﮐﺸﻮر ﺳﯿﺎهﺟﺎﻣ ﺎن آﻣﺪه اﺳﺖ‪ .‬ﻧﻬﺎﯾﺘﺎ در ﺧﻂ ﭼﻬﺎرم‪ M ،‬ﻋﺪد آﻣﺪه اﺳﺖ ﮐﻪ ﻋﺪد ‪i‬ام‪ ،Qi ،‬ﻧﺸﺎن دﻫﻨﺪه ﻗﺪرت ﺟﻨﮓ ﺟﻮﯾﺎن‬
‫ارﺗﺶ ﺳﯿﺎه ﺟﺎﻣ ﺎن آﻣﺪه اﺳﺖ‪.‬‬
‫‪١‬‬
‫ﺧﺮوﺟ‬
‫در ﺧﻂ اول در ﺻﻮرﺗ ﮐﻪ ﮐﺸﻮر ﺳﻔﯿﺪﺟﺎﻣ ﺎن ﭘﯿﺮوز ﻣﯿﺪان ﺧﻮاﻫﺪ ﺑﻮد‪ ،‬ﻋﺒﺎرت ‪ White‬و در ﺻﻮرﺗ ﮐﻪ ﮐﺸﻮر ﺳﯿﺎه ﺟﺎﻣ ﺎن‬
‫ﺑﺮﻧﺪه اﺳﺖ‪ ،‬ﻋﺒﺎرت ‪ Black‬را ﭼﺎپ ﮐﻨﯿﺪ‪ .‬ﺳﭙﺲ در ﺧﻂ دوم ﺗﻌﺪاد ﺟﻨﮓ ﺟﻮﯾﺎﻧ را ﮐﻪ از ﮐﺸﻮر ﺑﺮﻧﺪه‪ ،‬زﻧﺪه ﺑﺎﻗ ﻣﺎﻧﺪهاﻧﺪ‬
‫را ﭼﺎپ ﮐﻨﯿﺪ و در ﺧﻂ ﺳﻮم ﻗﺪرت ﻫﺮ ﯾ‬
‫ﻳ‬
‫از اﯾﻦ ﺟﻨﮕﺠﻮﻫﺎی زﻧﺪه را ﭘﺲ از ﻧﺒﺮد از ﮐﻮﭼ‬
‫ﺑﻪ ﺑﺰرگ ﺑﻨﻮﯾﺴﯿﺪ و آنﻫﺎ را ﺑﺎ‬
‫ﻓﺎﺻﻠﻪ از ﻫﻢ ﺟﺪا ﮐﻨﻴﺪ‪.‬‬
‫ﻣﺤﺪودﯾﺖﻫﺎ‬
‫‪١ ≤ N, M ≤ ١٠۵‬‬
‫‪١ ≤ Pi , Qi ≤ ١٠٩‬‬
‫ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ‬
‫‪stdin‬‬
‫‪stdout‬‬
‫‪Black‬‬
‫‪4‬‬
‫‪1‬‬
‫‪1 2 3 4‬‬
‫‪1‬‬
‫‪2‬‬
‫‪10 1‬‬
‫‪ ٢‬درﺧﺖ دودوﯾﯽ ﮐﺎرﺗﺰﯾﻦ‬
‫ﺑ ﺬارﯾﺪ ﻧﻮع ﺧﺎﺻ از درﺧﺖ دودوﯾﯽ ﺟﺴﺘﺠﻮ ‪ ١‬ﺑﻪ ﻧﺎم درﺧﺖﻫﺎی ﮐﺎرﺗﺰﯾﻦ ﺗﻌﺮﯾﻒ ﮐﻨﯿﻢ‪ .‬ﯾ‬
‫ﯾ‬
‫درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﺧﺎﺻﯿﺖﻫﺎی‬
‫درﺧﺖ دودوﯾﯽ ﺟﺴﺘﺠﻮ را داراﺳﺖ‪ .‬ﯾﻌﻨ ﻫﺮ ﮔﺮه دارای ‪ key‬اﺳﺖ؛ و اﮔﺮ ﮔﺮهی ‪ u‬در زﯾﺮدرﺧﺖ ﭼﭗ ﮔﺮهی ‪ v‬ﺑﺎﺷﺪ‬
‫دارﯾﻢ ‪ .keyu < keyv‬ﺑﺮﻋﮑﺲ‪ ،‬اﮔﺮ ﮔﺮهی ‪ u‬در زﯾﺮدرﺧﺖ راﺳﺖ ﮔﺮهی ‪ v‬ﺑﺎﺷﺪ دارﯾﻢ ‪.keyv < keyu‬‬
‫ﮔﺮهﻫﺎی درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﻋﻼوه ﺑﺮ ‪ key‬ﻣﻘﺪار ‪ value‬ﻫﻢ دارﻧﺪ‪ .‬ﺧﺎﺻﯿﺖ ﻣﻘﺎدﯾﺮ ‪ value‬ﮔﺮهﻫﺎ اﯾﻦ اﺳﺖ ﮐﻪ اﮔﺮ ﮔﺮهی ‪ u‬ﯾ‬
‫از ﺑﭽﻪﻫﺎی ﮔﺮهی ‪ v‬ﺑﺎﺷﺪ آﻧﮕﺎه دارﯾﻢ ‪ . valuev < valueu‬ﺑﻪ ﻃﻮر ﺷﻬﻮدی ﻣﻘﺪار ‪value‬ی ﮔﺮهﻫﺎ ﺧﺎﺻﯿﺖ ﯾ‬
‫درﺧﺖ‬
‫ﻫﺮﻣ ﮐﻤﯿﻨﻪ ‪ ٢‬را دارد‪.‬‬
‫ﺣﺎل از ﺷﻤﺎ ﻣ ﺧﻮاﻫﯿﻢ ﺑﺮﻧﺎﻣﻪای ﺑﻨﻮﯾﺴﯿﺪ ﮐﻪ ﻣﻘﺎدﯾﺮ ‪ key‬و ‪value‬ی ﮔﺮهﻫﺎ را ﺑ ﯿﺮد؛ ﺳﭙﺲ ﺑ ﻮﯾﺪ آﯾﺎ ﻣ ﺗﻮان ﺑﺎ اﯾﻦ ﮔﺮهﻫﺎ‬
‫ﯾ‬
‫درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﺳﺎﺧﺖ؟ اﮔﺮ ﻣ ﺗﻮان ﺳﺎﺧﺖ درﺧﺖ ﻧﻬﺎﯾﯽ ﺑﻪ ﭼﻪ ﺷ ﻠ ﺧﻮاﻫﺪ ﺷﺪ‪.‬‬
‫‪Binary Search Tree١‬‬
‫‪heap min٢‬‬
‫‪٢‬‬
‫ورودی‬
‫در ﺧﻂ اول ورودی ﺗﻨﻬﺎ ﻋﺪد ‪ n‬آﻣﺪه اﺳﺖ ﮐﻪ ﺗﻌﺪاد ﮔﺮهﻫﺎی درﺧﺖ اﺳﺖ‪ .‬در ‪ n‬ﺧﻂ ﺑﻌﺪی در ﻫﺮ ﺧﻂ دو ﻋﺪد ﺻﺤﯿﺢ آﻣﺪه‬
‫اﺳﺖ ﮐﻪ ﻋﺪد اول ‪ ،key‬و ﻋﺪد دوم ‪value‬ی ﮔﺮهی ‪i‬ام اﺳﺖ‪.‬‬
‫ﺧﺮوﺟ‬
‫در ﺻﻮرﺗ ﮐﻪ ﺑﺎ ‪ n‬ﮔﺮهی داده ﺷﺪه ﻣ ﺗﻮان ﯾ‬
‫درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﺳﺎﺧﺖ در ﺳﻄﺮ اول ﺧﺮوﺟ ﻋﺒﺎرت ‪ YES‬در ﻏﯿﺮ اﯾﻦ ﺻﻮرت‬
‫‪ NO‬ﭼﺎپ ﮐﻨﯿﺪ‪.‬‬
‫درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﺳﺎﺧﺖ در ‪ n‬ﺧﻂ ﺑﻌﺪی ﺧﻮد درﺧﺖ را ﭼﺎپ ﮐﻨﯿﺪ‪ .‬ﻧﺤﻮهی ﭼﺎپ ﮐﺮدن درﺧﺖ‬
‫اﮔﺮ ﺑﺎ اﯾﻦ ‪ n‬ﮔﺮه ﻣ ﺗﻮان ﯾ‬
‫ﺑﻪ اﯾﻦ ﺻﻮرت اﺳﺖ ﮐﻪ ﮔﺮهﻫﺎﯾﯽ ﮐﻪ در ورودی آﻣﺪه را ﺑﻪ ﻫﻤﺎن ﺗﺮﺗﯿﺐ از ‪ ١‬ﺗﺎ ‪ n‬ﺷﻤﺎرهﮔﺬاری ﮐﻨﯿﺪ‪ .‬ﺑﺮای ﻫﺮ ﮔﺮه‪ ،‬در ﯾ‬
‫ﺳﻄﺮ ﻣﺠﺰا ﺳﻪ ﻋﺪد ﭼﺎپ ﮐﻨﯿﺪ‪ .‬ﺷﻤﺎرهی ﭘﺪر اﯾﻦ ﮔﺮه‪ ،‬ﺑﭽﻪی ﭼﭗ اﯾﻦ ﮔﺮه و ﺑﭽﻪی راﺳﺖ اﯾﻦ ﮔﺮه را ﭼﺎپ ﮐﻨﯿﺪ‪ .‬در ﺻﻮرﺗ‬
‫ﮐﻪ ﯾ‬
‫ﮔﺮه ﻓﺎﻗﺪ ﮔﺮهی ﭘﺪر ﯾﺎ ﮔﺮهی ﺑﭽﻪی ﻣﺮﺑﻮﻃﻪ اﺳﺖ ﺟﺎی آن ﺻﻔﺮ ﭼﺎپ ﮐﻨﯿﺪ‪.‬‬
‫اﮔﺮ ﭼﻨﺪﯾﻦ درﺧﺖ ﮐﺎرﺗﺰﯾﻦ ﻣﻤ ﻦ ﺑﺮای ﭼﺎپ وﺟﻮد دارد‪ ،‬ﻫﺮ ﮐﺪام را ﮐﻪ ﺧﻮاﺳﺘﯿﺪ ﭼﺎپ ﮐﻨﯿﺪ‪.‬‬
‫ﻣﺤﺪودﯾﺖﻫﺎ‬
‫‪١ ≤ n ≤ ١٠٣‬‬
‫‪١ ≤ keyi , valuei ≤ ١٠٩‬‬
‫‪∀i 6= j : keyi 6= key j , valuei 6= value j‬‬
‫ورودی و ﺧﺮوﺟ ﻧﻤﻮﻧﻪ‬
‫‪stdin‬‬
‫‪stdout‬‬
‫‪YES‬‬
‫‪7‬‬
‫‪2 3 6‬‬
‫‪5 4‬‬
‫‪0 5 1‬‬
‫‪2 2‬‬
‫‪1 0 7‬‬
‫‪3 9‬‬
‫‪5 0 0‬‬
‫‪0 5‬‬
‫‪2 4 0‬‬
‫‪1 3‬‬
‫‪1 0 0‬‬
‫‪6 6‬‬
‫‪3 0 0‬‬
‫‪4 11‬‬
‫‪٣‬‬