FinalProject.pdf

‫ﺑﺎﺳﻤﻪ ﺗﻌﺎﻟﻲ‬
‫ﭘﺮوژهي ﭘﺎﻳﺎﻧﻲ درس دادهﺳﺎﺧﺘﺎرﻫﺎ و اﻟﮕﻮرﻳﺘﻢﻫﺎ‬
‫ﻣﺪرس‪ :‬ﻋﻠﻲ ﺷﺮﻳﻔﻲ زارﭼﻲ‬
‫دﺳﺘﻴﺎران ﭘﺮوژه‪ :‬وﺣﻴﺪ ﻟﻴﺎﻗﺖ‪ ،‬اﻣﻴﺮﺣﺴﻴﻦ ﻛﺪﻳﻮر‪ ،‬اﻓﺸﻴﻦ ﻧﻴﻜﺰاد‬
‫ﺗﺮم دوم ﺳﺎل ‪88-87‬‬
‫داﻧﺸﺠﻮﻳﺎن ﻋﺰﻳﺰ‪:‬‬
‫•‬
‫از ﺑﻴﻦ ‪ 4‬ﻣﻮﺿﻮع زﻳﺮ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ درﺳﺖ ‪ 2‬ﻣﻮﺿﻮع ﺑﺎﻋﺚ درﻳﺎﻓﺖ ﻛﻞ ‪ 4‬ﻧﻤﺮه ﭘﺮوژه ﭘﺎﻳﺎﻧﻲ ﻣﻲﮔﺮدد‪ .‬اراﺋﻪ ﺑﺮﻧﺎﻣﻪ درﺳﺖ ﺑﺮاي‬
‫‪ 3‬ﻣﻮﺿﻮع ﺑﻪ اﻓﺰاﻳﺶ ﻧﻤﺮه ﭘﺮوژه ﺗﺎ ﺳﻘﻒ ‪ 6‬ﻧﻤﺮه ﺧﻮاﻫﺪ ﺑﻮد‪ .‬ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ درﺳﺖ ﻫﺮ ‪ 4‬ﻣﻮﺿﻮع ﻋﻼوه ﺑﺮ ‪ 6‬ﻧﻤﺮه ﭘﺮوژه‪ ،‬در‬
‫ﻳﺎدﮔﻴﺮي ﺑﻬﺘﺮ درس ﻣﻮﺛﺮ اﺳﺖ‪.‬‬
‫•‬
‫ﺑﻴﺸﻴﻨﻪي ﻧﻤﺮهي ﭘﺮوژهي ﭘﺎﻳﺎﻧﻲ و اﻣﺘﺤﺎن ﻋﻤﻠﻲ اول ﺑﻪ ﻋﻨﻮان ﻧﻤﺮهي ﻋﻤﻠﻲ ﺛﺒﺖ ﺧﻮاﻫﺪ ﺷﺪ‪ .‬ﻟﺬا اﻧﺠﺎم اﻳﻦ ﭘﺮوژه ﺑﺮاي‬
‫داﻧﺸﺠﻮﻳﺎﻧﻲ ﻛﻪ از اﻣﺘﺤﺎن ﻋﻤﻠﻲ ﺧﻮد ﻧﻤﺮه رﺿﺎﻳﺖﺑﺨﺸﻲ درﻳﺎﻓﺖ ﻧﻤﻮدهاﻧﺪ ﺿﺮورﺗﻲ ﻧﺪارد‪ ،‬ﻫﺮﭼﻨﺪ ﺑﺮاي اﻓﺰاﻳﺶ ﻣﻬﺎرت‬
‫ﻋﻤﻠﻲ درﺳﻲ ﺗﻮﺻﻴﻪ ﻣﻲﮔﺮدد‪.‬‬
‫•‬
‫داﻧﺸﺠﻮﻳﺎن ﻣﻲﺗﻮاﻧﻨﺪ ﺑﻪ دلﺧﻮاه در ﻣﻮرد ﻧﺤﻮهي اﻧﺠﺎم ﭘﺮوژه ﻫﻢﻓﻜﺮي داﺷﺘﻪ ﺑﺎﺷﻨﺪ و ﺣﺘﻲ اﻟﮕﻮرﻳﺘﻢﻫﺎ و ﺑﺮﻧﺎﻣﻪﻫﺎ را ﺑﺎ‬
‫ﻳﻜﺪﻳﮕﺮ ﭼﻚ ﻛﻨﻨﺪ‪ ،‬وﻟﻲ ﻳﻚ داﻧﺸﺠﻮ ﺑﻪ ﻫﻴﭻ وﺟﻪ ﺣﻖ اﺳﺘﻔﺎده از ‪ Source Code‬دﻳﮕﺮان را ﻧﺪارد و ﺑﺎﻳﺪ ﻛﻞ ﻛﺪ ﺑﺮﻧﺎﻣﻪاي ﻛﻪ‬
‫ﺑﺮاي ﭘﺮوژه ارﺳﺎل ﻣﻲﻛﻨﺪ ﺗﻮﺳﻂ ﺧﻮد وي و ﺑﺪون دﺧﺎﻟﺖ دﻳﮕﺮان و ﺑﺪون اﺳﺘﻔﺎده از ﻛﺪ ﻧﻮﺷﺘﻪ ﺷﺪه ﺗﻮﺳﻂ دﻳﮕﺮان )ﺣﺘﻲ‬
‫ﻣﻮارد ﻣﻨﺘﺸﺮ ﺷﺪه روي اﻳﻨﺘﺮﻧﺖ( ﺑﺎﺷﺪ‪ .‬ﻫﻤﭽﻨﻴﻦ در اﺧﺘﻴﺎر ﮔﺬاﺷﺘﻦ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﺑﺮاي دﻳﮕﺮان ﻳﺎ ﻣﺸﺎرﻛﺖ در ﻛﺪ ﺑﺮﻧﺎﻣﻪي‬
‫دﻳﮕﺮان ﺑﻪ ﻫﺮ ﻧﺤﻮ ﻣﻤﻜﻦ ﻣﺠﺎز ﻧﻴﺴﺖ‪ .‬ﻋﺪم رﻋﺎﻳﺖ اﻳﻦ ﻣﻮارد ﺑﻪ ﻣﻌﻨﺎي زﻳﺮﭘﺎ ﮔﺬاﺷﺘﻦ اﺧﻼق آﻛﺎدﻣﻴﻚ و اﻧﺼﺮاف از ﻗﺒﻮﻟﻲ در‬
‫اﻳﻦ درس ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫•‬
‫ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺗﻨﻬﺎ ﻣﻲﺗﻮاﻧﻴﺪ از دادهﺳﺎﺧﺘﺎرﻫﺎي اوﻟﻴﻪ زﺑﺎن اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬ﺑﻬﺮهﮔﻴﺮي از دادهﺳﺎﺧﺘﺎرﻫﺎي ﭘﻴﺸﺮﻓﺘﻪ ﻣﺎﻧﻨﺪ‬
‫ﺗﻮاﺑﻊ ‪ STL‬ﻳﺎ ﻧﻈﺎﻳﺮ آن ﻣﺠﺎز ﻧﻴﺴﺖ‪.‬‬
‫•‬
‫زﻣﺎن اﻧﺠﺎم ﭘﺮوژهي ﭘﺎﻳﺎﻧﻲ ﻳﻚ ﻫﻔﺘﻪ از ﺗﺎرﻳﺦ اﻋﻼم آن ﻣﻲﺑﺎﺷﺪ‪.‬‬
‫ﻣﻮﺿﻮع اول‪ :‬ﻛﻨﺘﺮل ورود )‪(Login‬‬
‫در ﺳﺎﻳﺖ ‪ facebook‬ﺗﻌﺪادي ﻛﺎرﺑﺮ ﺛﺒﺖ ﻧﺎم ﻣﻲﻛﻨﻨﺪ‪ .‬ورود ﻛﺎرﺑﺮان از ﻃﺮﻳﻖ وارد ﻛﺮدن ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي و ﻛﻠﻤﻪي ﻋﺒﻮر اﻧﺠﺎم ﻣﻲﮔﻴﺮد‪ .‬ﺑﺎ‬
‫اﺳﺘﻔﺎده از روش ﻣﻨﺎﺳﺒﻲ ﻣﻲﺧﻮاﻫﻴﻢ ﻋﻤﻞ ﻛﻨﺘﺮل ﺗﻄﺎﺑﻖ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي و ﻛﻠﻤﻪي ﻋﺒﻮر ﻛﺎرﺑﺮان را در زﻣﺎن اﺟﺮا و ﺑﺎ ﺣﺎﻓﻈﻪي ﻛﺎرآﻣﺪي اﻧﺠﺎم‬
‫دﻫﻴﻢ‪ .‬در اﻳﻦ ﻣﺴﺎﻟﻪ ﺑﺮﻧﺎﻣﻪي ﺷﻤﺎ ﺑﺎﻳﺪ از دو دﺳﺘﻮر زﻳﺮ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﻨﺪ‪:‬‬
‫‪Add username password‬‬
‫ﻛﻪ ﻳﻚ ﻛﺎرﺑﺮ ﺟﺪﻳﺪ ﺑﺎ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ‪ username‬و ﻛﻠﻤﻪي ﻋﺒﻮر ‪ password‬اﺿﺎﻓﻪ ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎ دﻳﺪن اﻳﻦ‬
‫•‬
‫دﺳﺘﻮر در ورودي اﺳﺘﺎﻧﺪارد‪ ،‬ﻳﻚ ﻋﺒﺎرت ‪ Successful‬ﻳﺎ ‪ Failed‬در ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ﺑﻨﻮﻳﺴﺪ‪ .‬ﻫﻨﮕﺎﻣﻲ ﻋﺒﺎرت‬
‫‪ Successful‬ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮد ﻛﻪ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻗﺒﻼ ‪ Add‬ﻧﺸﺪه ﺑﺎﺷﺪ‪ ،‬در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻋﺒﺎرت ‪ Failed‬ﻧﻮﺷﺘﻪ‬
‫ﺧﻮاﻫﺪ ﺷﺪ‪ .‬در ﺻﻮرت ﻣﻮﻓﻖ ﺑﻮدن ﻋﻤﻞ‪ ،‬ﺑﺎﻳﺪ ﻛﺎرﺑﺮ ﺟﺪﻳﺪي ﺑﺎ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي و ﻛﻠﻤﻪي ﻋﺒﻮر ﺑﻪ ﻓﻬﺮﺳﺖ ﻛﺎرﺑﺮان اﻓﺰوده‬
‫ﺷﻮد‪.‬‬
‫‪Login username password‬‬
‫ﺑﺎ ﺧﻮاﻧﺪن اﻳﻦ دﺳﺘﻮر از ورودي اﺳﺘﺎﻧﺪارد‪ ،‬ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﻳﻚ ﻋﺒﺎرت ‪ Yes‬ﻳﺎ ‪ No‬در ﺧﺮوﺟﻲ اﺳﺘﺎﻧﺪارد ﺑﻨﻮﻳﺴﺪ‪.‬‬
‫•‬
‫ﻫﻨﮕﺎﻣﻲ ‪ Yes‬ﻧﻮﺷﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ ﻓﺮدي ﺑﺎ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي و ﻛﻠﻤﻪ ﻋﺒﻮر ﻣﻨﻄﺒﻖ ﺑﺮ دﺳﺘﻮر ﻗﺒﻼ در ﻓﻬﺮﺳﺖ ﻛﺎرﺑﺮان‬
‫وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ‪ .‬در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺮﻧﺎﻣﻪ ﻣﻲﺑﺎﻳﺴﺖ ‪ No‬را ﺑﻨﻮﻳﺴﺪ‪.‬‬
‫ورودي‬
‫در ﺧﻂ اول ورودي ‪ n‬داده ﺷﺪه اﺳﺖ و در ‪ n‬ﺧﻂ ﺑﻌﺪي ﻫﺮ دﺳﺘﻮر در ﻳﻚ ﺳﻄﺮ آﻣﺪه اﺳﺖ‪ .‬در ﻫﻴﭻ ﻧﺎم ﻛﺎرﺑﺮي ﻳﺎ ﻛﻠﻤﻪي ﻋﺒﻮر ﻛﺎراﻛﺘﺮي ﺑﻪ‬
‫ﻏﻴﺮ از ﺣﺮوف اﻧﮕﻠﻴﺴﻲ ﻛﻮﭼﻚ ﻳﺎ ارﻗﺎم ‪ 0‬ﺗﺎ ‪ 9‬وﺟﻮد ﻧﺪارد‪ .‬ﻫﻤﭽﻨﻴﻦ ﻓﺮﻣﺖ ﮔﻔﺘﻪ ﺷﺪه در ﺻﻮرت ﻣﺴﺎﻟﻪ دﻗﻴﻘﺎ در ورودي رﻋﺎﻳﺖ ﻣﻲﺷﻮد‪ ،‬ﻳﻌﻨﻲ‬
‫ﻣﺜﻼ ﺳﻄﺮ ﺧﺎﻟﻲ ﻳﺎ ﺳﻄﺮي ﻛﻪ در آن ﻳﻚ دﺳﺘﻮر ‪ Login‬ﺑﺪون ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻳﺎ ﻛﻠﻤﻪ ﻋﺒﻮر درج ﺷﺪه ﺑﺎﺷﺪ در ورودي وﺟﻮد ﻧﺨﻮاﻫﺪ داﺷﺖ‪.‬‬
‫ﺧﺮوﺟﻲ‬
‫در ﺧﺮوﺟﻲ ﺑﻪ ازاي ﻫﺮ دﺳﺘﻮر ورودي‪ ،‬ﺑﺎﻳﺪ ﭘﺎﺳﺦ ﻣﻨﺎﺳﺐ در ﻳﻚ ﺳﻄﺮ درج ﺷﻮد‪.‬‬
‫ﻣﺤﺪودﻳﺖ ﻫﺎ‬
‫•‬
‫ﺗﻌﺪاد دﺳﺘﻮرات ﺑﻴﺶ از ‪ 100,000‬ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫•‬
‫ﻃﻮل ﻫﺮ ﻧﺎم ﻛﺎرﺑﺮي و ﻛﻠﻤﻪي ﻋﺒﻮر ﺑﻴﺶ از ‪ 20‬ﺣﺮف ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ورودي ﻧﻤﻮﻧﻪ‬
10
Add gholi albaloo
Add goli zardaloo
Add gholi albaloo
Login manuch shalil
Add gholi1 gilas
Login goli zardaloo
Login gholi gilas
Add goli ananas
Login goli ananas
Login gholi1 gilas
‫ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‬
Successful
Successful
Failed
No
Successful
Yes
No
Failed
No
Yes
‫ﻣﻮﺿﻮع دوم‪ :‬ﭘﺸﺘﻪ )‪(Stack‬‬
‫در اﻳﻦ ﻣﺴﺌﻠﻪ ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ اﻋﻤﺎﻟﻲ ﻛﻪ ﺑﺮ روي ﻳﻚ ﭘﺸﺘﻪ اﻧﺠﺎم ﻣﻴﺸﻮﻧﺪ را ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ‪ .‬ﭘﺸﺘﻪ در اﺑﺘﺪا ﺧﺎﻟﻲ ﺑﻮده و ﻳﻚ ﻣﺘﻐﻴﺮ ﺑﺎ ﻧﺎم ‪ k‬در‬
‫اﺑﺘﺪاي دﺳﺘﻮرات داده ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ ﺗﺎ اﻧﺘﻬﺎي دﺳﺘﻮرات ﺗﻐﻴﻴﺮ ﻧﺨﻮاﻫﺪ ﻛﺮد‪ .‬دﺳﺘﻮراﺗﻲ ﻛﻪ ﺑﺎﻳﺪ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﻨﻴﺪ‪:‬‬
‫‪Push x‬‬
‫•‬
‫ﻛﻪ ﻋﺪد ﺻﺤﻴﺢ ‪ x‬را ﺑﻪ ﺑﺎﻻي ﭘﺸﺘﻪ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ‪.‬‬
‫‪Top‬‬
‫•‬
‫ﺑﺎ دﻳﺪن اﻳﻦ دﺳﺘﻮر‪ ،‬در ﺧﺮوﺟﻲ ﺑﺎﻳﺪ ﻋﺪد ﺑﺎﻻي ﭘﺸﺘﻪ ﭼﺎپ ﺷﻮد )ﻋﻀﻮ ﺑﺎﻻ از ﭘﺸﺘﻪ ﺧﺎرج ﻧﺨﻮاﻫﺪ ﺷﺪ(‬
‫‪Max‬‬
‫•‬
‫ﻛﻪ ﺑﺎﻳﺪ ﻣﻘﺪار ﺑﻴﺸﻴﻨﻪ ي ‪ k‬ﻋﺪد ﺑﺎﻻي ﭘﺸﺘﻪ را در ﺧﺮوﺟﻲ ﭼﺎپ ﻛﻨﻴﺪ‪.‬‬
‫‪Flip‬‬
‫ﺑﺎ دﻳﺪن اﻳﻦ دﺳﺘﻮر‪ k ،‬ﻋﺪد ﺑﺎﻻي ﭘﺸﺘﻪ ﺑﺎﻳﺴﺘﻲ ﺗﺮﺗﻴﺒﺸﺎن ﺑﺮ ﻋﻜﺲ ﺷﻮد‪ ،‬ﻳﻌﻨﻲ ﻋﻀﻮ اول ﺣﺎﻟﺖ ﺟﺪﻳﺪ‪ ،‬ﻋﻀﻮ ‪k‬ام ﺣﺎﻟﺖ‬
‫ﻗﺪﻳﻢ ﺑﻮده‪ ،‬ﻋﻀﻮ دوم ﺟﺪﻳﺪ‪ ،‬ﻋﻀﻮ ‪k-1‬ام ﻗﺪﻳﻢ ﺑﻮده‪ ،‬و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ در ﻧﻬﺎﻳﺖ ﻋﻀﻮ ‪k‬ام ﺟﺪﻳﺪ‪ ،‬ﻋﻀﻮ اول ﻗﺪﻳﻢ ﺧﻮاﻫﺪ‬
‫ﺑﻮد‪.‬‬
‫داده ﺳﺎﺧﺘﺎري ﻣﻨﺎﺳﺐ ﺑﺮاي ﭘﺸﺘﻴﺒﺎﻧﻲ از اﻳﻦ دﺳﺘﻮرات ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ‪.‬‬
‫ورودي‬
‫در ﺧﻂ اول ورودي ‪ k‬داده ﺷﺪه اﺳﺖ و در ﺧﻂ دوم ‪ T‬ﺗﻌﺪاد دﺳﺘﻮرات ﻣﻲآﻳﺪ و ﺑﻌﺪ از آن ‪ T‬دﺳﺘﻮر ﻫﺮﻛﺪام در ﻳﻚ ﺧﻂ آﻣﺪه اﺳﺖ‪.‬‬
‫ﺧﺮوﺟﻲ‬
‫در ﺧﺮوﺟﻲ ﺑﻪ ازاي ﻫﺮ دﺳﺘﻮر ‪ Top‬و ‪ Max‬ﺑﺎﻳﺪ در ﻳﻚ ﺧﻂ‪ ،‬ﻳﻚ ﻋﺪد ﭼﺎپ ﺷﻮد‪.‬‬
‫ﻣﺤﺪودﻳﺖ ﻫﺎ‬
‫•‬
‫ﺗﻌﺪاد دﺳﺘﻮرات ﺑﻴﺶ از ‪ 100,000‬ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫•‬
‫ﻣﻘﺪار ‪ k‬ﺣﺪاﻛﺜﺮ ‪ 20,000‬ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫•‬
‫ورودي ﻧﻤﻮﻧﻪ‬
4
11
Push 5
Push 4
Max
Push 1
Top
Push 4
Push 6
Flip
Top
Push 3
Max
‫ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‬
5
1
4
4
‫ﻣﻮﺿﻮع ﺳﻮم‪ :‬ﺷﺒﻜﻪ دوﺳﺘﻲ )‪(Network‬‬
‫در ‪ facebook‬ﺗﻌﺪادي ﻛﺎرﺑﺮ وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﻴﻦ ﻫﺮ دو ﻧﻔﺮ از اﻳﻦ ﻛﺎرﺑﺮان ﻣﻤﻜﻦ اﺳﺖ راﺑﻄﻪي دوﺳﺘﻲ ﺑﺮﻗﺮار ﺷﻮد‪ .‬ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ اﻃﻼﻋﺎت اﻳﻦ‬
‫ﺷﺒﻜﻪ را ﺑﻪ ﻧﺤﻮي ذﺧﻴﺮه ﺳﺎزي ﻛﻨﻴﺪ ﻛﻪ در زﻣﺎن ﻣﻨﺎﺳﺐ دﻧﺒﺎﻟﻪاي از دﺳﺘﻮرات ﻣﺘﺸﻜﻞ از ﺳﻪ ﻧﻮع زﻳﺮ را اﻋﻤﺎل ﻛﻨﺪ‪) :‬ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻛﺎرﺑﺮ‬
‫ﻳﻚ ﻋﺪد ﻳﻜﺘﺎ ﺑﻌﻨﻮان ﺷﻨﺎﺳﻪ دارد‪ .‬در ﺷﺮوع ﻛﺎر ﺳﻴﺴﺘﻢ‪ ،‬ﻣﺘﻐﻴﺮي ﺑﻪ ﻧﺎم ‪ last‬ﺑﺎ ﻣﻘﺪار ﺻﻔﺮ ﺑﺎرﮔﺬاري ﻣﻲﺷﻮد و ﺑﺎ ورود ﻳﻚ ﻛﺎرﺑﺮ ﺟﺪﻳﺪ‪ ،‬ﻣﺘﻐﻴﺮ‬
‫‪ last‬ﻳﻜﻲ اﺿﺎﻓﻪ ﺷﺪه‪ ،‬و ﺷﻨﺎﺳﻪي آن ﻛﺎرﺑﺮ ﺑﺮاﺑﺮ ﻣﻘﺪار ﺟﺪﻳﺪ ‪ last‬ﻗﺮار ﻣﻲﮔﻴﺮد‪ .‬ﺑﻪ ﻃﻮر ﻣﺜﺎل ﺷﻨﺎﺳﻪي اوﻟﻴﻦ ﻛﺎرﺑﺮ ﺑﺮاﺑﺮ ‪ 1‬اﺳﺖ(‬
‫‪Add x‬‬
‫ﺑﺎ دﻳﺪن اﻳﻦ دﺳﺘﻮر‪ ،‬ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ ‪ x‬ﻛﺎرﺑﺮ ﺟﺪﻳﺪ ﺑﻪ ﺳﻴﺴﺘﻢ اﺿﺎﻓﻪ ﻛﻨﻴﺪ ) ﻛﻪ اﮔﺮ ﻣﻘﺪار ‪ last‬را ﻗﺒﻞ از اﻳﻦ دﺳﺘﻮر ‪t‬‬
‫•‬
‫ﺑﮕﻴﺮﻳﻢ ﺷﻨﺎﺳﻪﻫﺎي آنﻫﺎ ﺑﺮاﺑﺮ ‪ t+1‬ﺗﺎ ‪ t+x‬ﺧﻮاﻫﺪ ﺷﺪ و ﻣﺘﻐﻴﺮ ‪ last‬ﺑﻪ ﺗﻨﺎﺳﺐ ﺑﻪروز ﺧﻮاﻫﺪ ﺷﺪ(‪.‬‬
‫‪Group e v1 v2 … ve‬‬
‫در اﺑﺘﺪاي اﻳﻦ دﺳﺘﻮر ﻳﻚ ﻋﺪد ‪ (e>=2) e‬ﻗﺮار دارد و ﺑﻌﺪ از آن ﺷﻨﺎﺳﻪي ‪ e‬ﻛﺎرﺑﺮ داده ﻣﻲﺷﻮد ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ ﺑﻴﻦ ﻫﺮ‬
‫•‬
‫دو ﻧﻔﺮ از اﻳﻦ ‪ e‬ﻛﺎرﺑﺮ ﻳﻚ راﺑﻄﻪي دوﺳﺘﻲ ﻓﺮض ﻛﻨﻴﺪ‪ .‬ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻌﻀﻲ از اﻳﻦ ﻛﺎرﺑﺮان ﻗﺒﻼ ﻫﻢ ﺑﺎ‬
‫ﻳﻜﺪﻳﮕﺮ راﺑﻄﻪي دوﺳﺘﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ‪.‬‬
‫‪Isrelative u v‬‬
‫در ﭘﺎﺳﺦ اﻳﻦ دﺳﺘﻮر‪ ،‬اﮔﺮ دﻧﺒﺎﻟﻪاي از دوﺳﺘﻲ ﺑﻴﻦ دو ﻛﺎرﺑﺮ ﺑﺎ ﺷﻨﺎﺳﻪﻫﺎي ‪ u‬و ‪ v‬وﺟﻮد داﺷﺖ‪ ،‬در ﺧﺮوﺟﻲ ﻋﺒﺎرت ”‪ “yes‬و‬
‫•‬
‫در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻋﺒﺎرت ”‪ “no‬را ﭼﺎپ ﻛﻨﻴﺪ‪ .‬ﻣﻨﻈﻮر از دﻧﺒﺎﻟﻪي دوﺳﺘﻲ‪ ،‬دﻧﺒﺎﻟﻪاي از ﻛﺎرﺑﺮان اﺳﺖ ﻛﻪ ﻫﺮ دو ﻛﺎرﺑﺮ‬
‫ﭘﺸﺖﺳﺮ ﻫﻢ ﺑﺎ ﻫﻢ دوﺳﺖ ﻫﺴﺘﻨﺪ و اول و آﺧﺮ اﻳﻦ دﻧﺒﺎﻟﻪ ‪ u‬و ‪ v‬اﺳﺖ‪.‬‬
‫ورودي‬
‫در ﺧﻂ اول ورودي ‪ T‬ﺗﻌﺪاد دﺳﺘﻮرات ﻣﻲآﻳﺪ و ﺑﻌﺪ از آن ‪ T‬دﺳﺘﻮر ﻫﺮﻛﺪام در ﻳﻚ ﺧﻂ آﻣﺪه اﺳﺖ‪.‬‬
‫ﺧﺮوﺟﻲ‬
‫در ﺧﺮوﺟﻲ ﺑﻪ ازاي ﻫﺮ دﺳﺘﻮر ‪ Isrelative‬ﺑﺎﻳﺪ ﻳﻚ ﺧﻂ ﺷﺎﻣﻞ ”‪ “yes‬ﻳﺎ ”‪ “no‬ﭼﺎپ ﺷﻮد‪.‬‬
‫ﻣﺤﺪودﻳﺖ ﻫﺎ‬
‫•‬
‫ﺗﻌﺪاد دﺳﺘﻮرات ﺑﻴﺶ از ‪ 100,000‬ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫•‬
‫ﺗﻌﺪاد ﻛﻞ ﻛﺎرﺑﺮان ﺑﻴﺸﺘﺮ از ﻳﻚ ﻣﻴﻠﻴﻮن ﻛﺎرﺑﺮ ﻧﺨﻮاﻫﺪ ﺷﺪ‪.‬‬
‫•‬
‫ﻣﺠﻤﻮع اﻧﺪازهي ﮔﺮوهﻫﺎ )ﺟﻤﻊ ﭘﺎراﻣﺘﺮﻫﺎي ‪ e‬در ﻫﻤﻪي دﺳﺘﻮرات ‪ ،(Group‬ﺑﻴﺶ از ‪ 10,000‬ﻧﺨﻮاﻫﺪ ﺑﻮد‪ .‬ﻫﻤﭽﻨﻴﻦ در ‪ %70‬ﺗﺴﺖﻫﺎ‬
‫ﺗﻌﺪاد رواﺑﻂ دوﺳﺘﻲ ﺣﺪاﻛﺜﺮ ‪ 10,000‬ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ورودي ﻧﻤﻮﻧﻪ‬
9
Add 5
Group 3 1 5 3
Group 3 1 3 4
Isrelative 4 5
Isrelative 2 4
Add 3
Group 2 3 7
Group 2 7 6
Isrelative 2 6
‫ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‬
yes
no
yes
‫ﻣﻮﺿﻮع ﭼﻬﺎرم‪ :‬ﺗﻮپ ﺑﺎزي )‪(Ball‬‬
‫‪ n‬ﻛﻴﺴﻪي ﺧﺎﻟﻲ دارﻳﻢ )‪ (A1, A2, …,An‬ﻛﻪ در ﻫﺮﻛﺪام ﻣﻲﺗﻮان ﺣﺪاﻛﺜﺮ ﻳﻚ ﺗﻮپ ﻗﺮار داد‪ .‬در ﻫﺮ ﻧﻮﺑﺖ »ﭘﺮﺗﺎب ﺗﻮپ«‪ ،‬ﻳﻚ ﻋﺪد ‪ i‬ﺑﻪ ﻣﺎ داده‬
‫ﻣﻲﺷﻮد ﻛﻪ ﺑﺎﻳﺪ در ﺻﻮرﺗﻲ ﻛﻪ ‪ Ai‬ﺧﺎﻟﻲ اﺳﺖ‪ ،‬در آن ﻳﻚ ﺗﻮپ ﭘﺮﺗﺎب ﻛﻨﻴﻢ )ﭘﺮﺗﺎب ﻣﻮﻓﻘﻴﺖ آﻣﻴﺰ(‪ .‬و اﮔﺮ ‪ Ai‬ﺧﺎﻟﻲ ﻧﻴﺴﺖ )ﭘﺮﺗﺎب ﻧﺎﻣﻮﻓﻖ( ﺑﺎﻳﺪ‬
‫»ﺷﻤﺎرهي ﻛﻴﺴﻪﻫﺎي اول و آﺧﺮ دﻧﺒﺎﻟﻪي ﻣﺎﻛﺴﻴﻤﺎل ﻛﻴﺴﻪﻫﺎي ﻣﺘﻮاﻟﻲ ﭘﺮ ﺷﺎﻣﻞ ‪ «Ai‬را اﻋﻼم ﻛﻨﻴﻢ‪.‬‬
‫ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ ﺣﺎﻟﺖ زﻳﺮ را در ﻣﻮرد ﻛﻴﺴﻪﻫﺎ )ﺑﻌﺪ از ﺗﻌﺪادي ﻋﻤﻠﻴﺎت( در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ )در اﻳﻦ ﺷﻜﻞ‪ ،‬ﺧﺎﻧﻪﻫﺎي ﭘﺮ ﻧﻤﺎﻳﺶدﻫﻨﺪهي ﻛﻴﺴﻪﻫﺎي‬
‫ﭘﺮ اﺳﺖ(‪:‬‬
‫‪27‬‬
‫‪26‬‬
‫‪25‬‬
‫‪24‬‬
‫‪23‬‬
‫‪22‬‬
‫‪21‬‬
‫‪20‬‬
‫‪19‬‬
‫‪18‬‬
‫‪17‬‬
‫‪16‬‬
‫‪15‬‬
‫‪14‬‬
‫‪13‬‬
‫‪12‬‬
‫‪11‬‬
‫‪10‬‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫اﮔﺮ ﻋﺪد ورودي ‪ 10‬ﺑﺎﺷﺪ‪ ،‬ﻛﻴﺴﻪي ‪-10‬ام را ﭘﺮ ﻣﻲ ﻛﻨﻴﻢ‪ ،‬و ﺑﻪ ﺣﺎﻟﺖ زﻳﺮ ﻣﻲرﺳﻴﻢ‪:‬‬
‫‪27‬‬
‫‪26‬‬
‫‪25‬‬
‫‪24‬‬
‫‪23‬‬
‫‪22‬‬
‫‪21‬‬
‫‪20‬‬
‫‪19‬‬
‫‪18‬‬
‫‪17‬‬
‫‪16‬‬
‫‪15‬‬
‫‪14‬‬
‫‪13‬‬
‫‪12‬‬
‫‪11‬‬
‫‪10‬‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫ﺣﺎﻻ اﮔﺮ ﻋﺪد ورودي ‪ 19‬ﺑﺎﺷﺪ‪ ،‬ﺑﺎﻳﺪ »دﻧﺒﺎﻟﻪي ﻣﺎﻛﺴﻴﻤﺎل ﻛﻴﺴﻪﻫﺎي ﻣﺘﻮاﻟﻲ ﭘﺮ ﺷﺎﻣﻞ ‪ «A19‬را ﺷﻨﺎﺳﺎﻳﻲ ﻛﻨﻴﻢ‪ .‬در ﺣﺎﻟﺘﻲ ﻛﻪ در ﺷﻜﻞ ﻓﻮق‬
‫ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ اﻳﻦ دﻧﺒﺎﻟﻪ ﻣﺎﻛﺴﻴﻤﺎل از ﻛﻴﺴﻪﻫﺎ ﻋﺒﺎرﺗﺴﺖ از ‪ .A16,A17,A18,A19,A20,A21,A22‬ﺑﻨﺎﺑﺮاﻳﻦ ﺷﻤﺎرهي ﻛﻴﺴﻪﻫﺎي‬
‫اول و آﺧﺮ آن ﻳﻌﻨﻲ ‪ 16‬و ‪ 22‬ﺑﺎﻳﺪ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭼﺎپ ﺷﻮد و وﺿﻌﻴﺖ ﺗﻮﭘﻬﺎي درون ﻛﻴﺴﻪﻫﺎ دﺳﺖ ﻧﺨﻮرده ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ‪.‬‬
‫ﺑﺮﻧﺎﻣﻪاي ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﻨﻮﻳﺴﻴﺪ‪ .‬دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻋﻤﻞ ﻳﺎ ﺻﺮﻓﺎ ﺑﺎ ﻗﺮار دادن ﺗﻮپ در ﻳﻚ ﻛﻴﺴﻪ ﭘﺎﻳﺎن ﻣﻲﻳﺎﺑﺪ‪ ،‬ﻳﺎ ﺑﺎﻳﺪ در ﭘﺎﺳﺦ ﺑﻪ آن دو ﻋﺪد ﺑﻪ‬
‫ﻋﻨﻮان »ﺷﻤﺎرهي ﻛﻴﺴﻪﻫﺎي اول و آﺧﺮ دﻧﺒﺎﻟﻪي ﻣﺎﻛﺴﻴﻤﺎل ﻛﻴﺴﻪﻫﺎ ﭘﺮ ﻣﺘﻮاﻟﻲ« اﻋﻼم ﺷﻮد‪.‬‬
‫ورودي‬
‫در ﺳﻄﺮ اول ‪ N‬ﺗﻌﺪاد ﻛﻴﺴﻪﻫﺎ و ‪ T‬ﺗﻌﺪاد اﻋﻤﺎﻟﻲ ﻛﻪ در اداﻣﻪ روي ﻛﻴﺴﻪﻫﺎ اﻋﻤﺎل ﺧﻮاﻫﺪ ﺷﺪ داده ﺧﻮاﻫﺪ ﺷﺪ‪ .‬و ﺳﭙﺲ در ‪ T‬ﺳﻄﺮ آﻳﻨﺪه‪ ،‬در ﻫﺮ‬
‫ﻛﺪام ﻳﻚ ﻋﺪد ﺑﻴﻦ ‪ 1‬ﺗﺎ ‪ N‬داده ﻣﻲﺷﻮد‪ ،‬ﻛﻪ ﺷﻤﺎرهي ﻛﻴﺴﻪاي اﺳﺖ ﻛﻪ »ﭘﺮﺗﺎب ﺗﻮپ« ﺑﺎﻳﺪ روي آن اﻧﺠﺎم ﺷﻮد‪ .‬ﺑﺮاي ﺳﺎدﮔﻲ ﻣﻲﺗﻮاﻧﻴﺪ ﻓﺮض‬
‫ﻛﻨﻴﺪ در ﻧﻤﻮﻧﻪﻫﺎي ورودي ﺗﻮزﻳﻊ اﺣﺘﻤﺎل ﻣﻘﺎدﻳﺮ ﻣﺨﺘﻠﻒ ﺑﺮاي ﺷﻤﺎره ﻛﻴﺴﻪﻫﺎ ﻳﻜﻨﻮاﺧﺖ اﺳﺖ‪.‬‬
‫ﺧﺮوﺟﻲ‬
‫ﺑﺮاي ﺳﻄﺮ از ﻫﺮ ﻧﻤﻮﻧﻪ ﺑﺎﻳﺪ ﻳﻚ ﺳﻄﺮ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﭼﺎپ ﻛﻨﻴﺪ ﻛﻪ در ﺻﻮرت ﻣﻮﻓﻘﻴﺖ آﻣﻴﺰ ﺑﻮدن »ﭘﺮﺗﺎب ﺗﻮپ«‪ ،‬ﻋﺒﺎرت ‪ Yes‬و در ﻏﻴﺮ اﻳﻦ‬
‫ﺻﻮرت دو ﻋﺪد ﻣﻮرد ﻧﻈﺮ ﭼﺎپ ﺷﻮﻧﺪ ‪.‬‬
‫ﻣﺤﺪودﻳﺖ ﻫﺎ‬
‫ﻓﺮض ﻛﻨﻴﺪ ‪ N‬ﺣﺪاﻛﺜﺮ ‪ 1000,000‬اﺳﺖ‪ .‬ﻫﻤﭽﻨﻴﻦ ﻣﻘﺪار ‪ T‬از ‪ 100,000‬ﺑﻴﺸﺘﺮ ﻧﺨﻮاﻫﺪ ﺑﻮد‪.‬‬
‫ورودي ﻧﻤﻮﻧﻪ‬
‫‪7 7‬‬
‫‪5‬‬
‫‪7‬‬
‫‪5‬‬
‫‪4‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫ﺧﺮوﺟﻲ ﻧﻤﻮﻧﻪ‬
‫‪Yes‬‬
‫‪Yes‬‬
‫‪5 5‬‬
‫‪Yes‬‬
‫‪Yes‬‬
‫‪Yes‬‬
‫‪2 5‬‬
‫»ﻫﻤﭽﻮن ﺳﭙﻴﺪار‪ ،‬ﺳﺒﺰ و ﺳﺮﻓﺮاز ﺑﺎﺷﻴﺪ«‬