ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

ฉันกำลังเตรียมตัวสำหรับ Google HashCode World Championship Finals 2017 นี่คือการแข่งขันที่ใหญ่ที่สุดที่มีปัญหาอัลกอริทึมซึ่งจัดโดย Google

ฉันเริ่มเรียน C++ ตั้งแต่เริ่มต้นตอนเกรด XNUMX ฉันไม่รู้อะไรเลยเกี่ยวกับการเขียนโปรแกรม อัลกอริธึม หรือโครงสร้างข้อมูล เมื่อถึงจุดหนึ่งฉันก็เขียนโค้ดบรรทัดแรก เจ็ดเดือนต่อมา การแข่งขันเขียนโปรแกรมก็ใกล้เข้ามาแล้ว ฉันอยากจะเห็นว่าสไตล์การเรียนรู้การเขียนโปรแกรมของฉันทำงานได้ดีแค่ไหน มันเป็นโอกาสที่สมบูรณ์แบบ

หลังจากการแข่งขันสองวัน ผลลัพธ์ก็มาถึง ฉันได้รับรางวัลเหรียญทอง

ฉันตกใจมาก ฉันนำหน้าคู่แข่งด้วยประสบการณ์ 5 ปี ฉันรู้ว่าฉันทำงานหนัก แต่ความสำเร็จนี้เกินความคาดหมายทั้งหมดของฉัน ฉันรู้ว่ารายการกีฬาเป็นหัวข้อของฉันและมุ่งความสนใจไปที่มัน

ฉันรู้ว่าอะไรทำให้ฉันประสบความสำเร็จและฉันต้องการแบ่งปันกับคุณ

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

บทความนี้ได้รับการแปลโดยได้รับการสนับสนุนจาก EDISON Software ซึ่ง ดูแลสุขภาพของโปรแกรมเมอร์และอาหารเช้าของพวกเขาและ พัฒนาซอฟต์แวร์ที่กำหนดเอง.

เลือกภาษาโปรแกรมอะไร

  • C++ - ขอแนะนำอย่างยิ่ง! เขาเร็วมาก การใช้อัลกอริทึมใช้เวลาเพียงเล็กน้อยเนื่องจาก STL ยอมรับ C++ ในทุกการแข่งขัน ฉันเขียนโค้ดบรรทัดแรกด้วยภาษา C++
  • C - เรียนรู้ C ++ เพราะ STL ถ้าคุณรู้จัก C คุณก็เขียนโปรแกรมในภาษา C++ ได้เช่นกัน
  • Java เป็นภาษาโปรแกรมที่ช้า มันมีคลาส Big Integer แต่มันจะไม่ช่วยอะไรคุณมากนัก หากการแข่งขันมีเวลาจำกัด ด้วย Java คุณจะเกินนั้นอย่างแน่นอน Java ไม่ได้รับการยอมรับในการแข่งขันทั้งหมด

ฝึกได้ที่ไหน.

ฉันแนะนำ ผู้ตัดสิน Sphere Online (SPOJ). เป็นทรัพยากรที่มีประสิทธิภาพทั้งในด้านปริมาณและคุณภาพ บรรณาธิการและวิธีแก้ปัญหาพร้อมใช้งานออนไลน์ หากคุณติดขัดในกระบวนการแก้ไขปัญหา นอกจากเว็บไซต์นี้ฉันขอแนะนำ ชุดเครื่องมือ SPOJ и ตัวแยกประเภทปัญหาสำหรับ SPOJ.pl.

ขั้นแรก คุณต้องฝึกฝนความรู้พื้นฐานของคุณ

เมื่อคุณคุ้นเคยกับไวยากรณ์ของภาษาแล้ว ก็มีปัญหาบางประการที่ต้องแก้ไข เริ่มต้นด้วยปัญหาง่ายๆ ที่ต้องฝึกฝน ในขั้นตอนนี้ สิ่งสำคัญคือการกำหนดสไตล์การเขียนโปรแกรมของคุณ บางทีคุณอาจต้องการเขียนโค้ดที่มีช่องว่างมาก บางทีคุณอาจไม่ชอบ คุณอาจวางวงเล็บไว้ในบรรทัดเดียวกับ “if” หรืออาจแยกวงเล็บออกจากกัน

คุณต้องค้นหาสไตล์การเขียนโปรแกรมของคุณเพราะมันเป็นสไตล์ของคุณ

เมื่อคุณมองหามัน ให้จำหลักการพื้นฐานสองประการ:

  • รหัสของคุณควรใช้งานง่าย คุณควรรู้สึกสบายใจที่จะนำโซลูชันที่คุณคิดขึ้นมาไปใช้ ทำไม เพราะในระหว่างการแข่งขัน สิ่งสุดท้ายที่คุณต้องการคือการหลงลืมรหัสของคุณ เป็นการดีกว่าเสมอที่จะใช้เวลาเพิ่มอีก 5 นาทีในการคิดถึงวิธีทำให้การใช้งานโค้ดง่ายขึ้น แทนที่จะใช้เวลา 10 นาทีในการพยายามคิดออก
  • รหัสของคุณควรอ่านง่าย เมื่อโค้ดอ่านง่าย การดีบักก็ง่าย ยอมรับเถอะว่าข้อบกพร่องเกิดขึ้นตลอดเวลา คุณรู้ไหมถึงความรู้สึกนั้นเมื่อคุณเหลือเวลาอีก 10 นาทีและไม่พบข้อผิดพลาดร้ายแรง? แน่นอนคุณทำ เพื่อหลีกเลี่ยงสถานการณ์นี้ ให้เขียนโค้ดที่อ่านง่าย เมื่อคุณเริ่มแก้ไขโค้ดแล้ว โค้ดจะดูเป็นธรรมชาติและเข้าใจง่าย

นี่คือตัวอย่างของฉัน สไตล์การเขียนโปรแกรม

วิธีการพัฒนาทักษะการพัฒนาของคุณ

ฝึกฝน ฝึกฝน และฝึกฝนให้มากขึ้น ฉันขอแนะนำให้คุณแก้ไขปัญหาที่แก้ไขได้มากที่สุด 250 อันดับแรก Spoj. แก้ปัญหาตามลำดับ ใช้เวลาอย่างน้อยหนึ่งชั่วโมงเพื่อคิดถึงวิธีแก้ปัญหาของแต่ละข้อ

อย่าพูดว่า: "ปัญหานี้ยากเกินไปสำหรับฉัน ฉันจะพยายามแก้ไขปัญหาต่อไป" นี่คือวิธีที่ผู้แพ้คิด

หยิบกระดาษและดินสอ ลองคิดดูสิ บางทีคุณอาจพบวิธีแก้ปัญหาบางทีอาจจะไม่ใช่ อย่างน้อยที่สุด คุณจะพัฒนาการคิดแบบอัลกอริทึม หากคุณไม่สามารถหาวิธีแก้ปัญหาได้ภายในหนึ่งชั่วโมง ให้มองหาวิธีแก้ปัญหาสำเร็จรูปในฟอรัมหรือในบทความ

คุณจะได้อะไรจากแนวทางนี้? เรียนรู้การนำแนวคิดของคุณไปใช้อย่างรวดเร็วโดยใช้โค้ด และศึกษาปัญหาและอัลกอริทึมแบบคลาสสิก

ประการที่สอง คุณต้องเชี่ยวชาญอัลกอริธึมและโครงสร้างข้อมูล

ปฏิบัติตามแนวทางแบบลำดับชั้น คุณเริ่มวิ่งโดยไม่รู้ว่าจะเดินอย่างไร? เลขที่ คุณสามารถสร้างตึกระฟ้าโดยไม่มีรากฐานที่มั่นคงได้หรือไม่? ไม่มีอีกครั้ง.

คุณไม่สามารถละเลยขั้นตอนต่างๆ ในเส้นทางการเรียนรู้ได้ หากคุณเพิกเฉย คุณจะเหลือช่องว่างความรู้ เมื่อเวลาผ่านไปพวกเขาจะแย่ลงเท่านั้น

เริ่มต้นด้วยอัลกอริธึมพื้นฐานและโครงสร้างข้อมูล

มันยากที่จะเริ่มต้น อาจเป็นเพราะไม่รู้ว่าจะเรียนอะไรก่อน นั่นเป็นเหตุผล ฉันสร้างหลักสูตรวิดีโอ “อัลกอริทึมและโครงสร้างข้อมูล”. เมื่อสร้างหลักสูตรนี้ ฉันยึดตามวิธีที่ฉันต้องการจะสอน ปฏิกิริยานั้นช่างเหลือเชื่อ! นักเรียนมากกว่า 3000 คนจากกว่า 100 ประเทศลงทะเบียนเรียนหลักสูตรนี้ในเดือนแรก

หากคุณพยายามแก้ไขปัญหาง่ายๆ คุณจะไม่มีวันพัฒนาเลย

วิธีที่มีประสิทธิภาพที่สุดในการทำความเข้าใจสิ่งที่คุณไม่รู้คือการสัมผัสกับมันในทางปฏิบัติ นั่นคือวิธีที่ฉันเรียนรู้ ฉันได้เรียนรู้เทคนิคใหม่ๆ มากมายที่ฉันไม่เคยได้ยินมาก่อนโดยการเลือกงานที่ท้าทาย

ทุกปัญหาที่สามที่คุณทำควรสอนอะไรใหม่ๆ ให้กับคุณ ระมัดระวังมากขึ้นเมื่อเลือกปัญหา เลือกปัญหาที่ยากขึ้น!

เมื่อคุณทำโจทย์ทั้ง 250 ข้อจาก SPOJ เสร็จแล้ว คุณจะมีความเข้าใจพื้นฐานเกี่ยวกับหัวข้อหลักของรายการกีฬา ด้วยความเข้าใจอย่างลึกซึ้งเกี่ยวกับตรรกะเบื้องหลังอัลกอริธึมพื้นฐาน อัลกอริธึมระดับสูงจะดูซับซ้อนน้อยลง ด้วยวิธีนี้คุณจะสามารถใช้ความรู้ให้เกิดประโยชน์สูงสุดได้

เจาะลึกเข้าไปในแต่ละธีมหลัก

นี่คือทรัพยากรที่มีคุณค่า มีข้อมูลมากมาย คุณจะพบอัลกอริธึมและโครงสร้างข้อมูล 10 อันดับแรกสำหรับแต่ละหัวข้อ หลังจาก 250 ปัญหาจาก SPOJ คุณจะรู้อะไรมากมายจากรายการนี้ แต่คุณยังจะสะดุดกับหลายสิ่งที่คุณไม่เคยได้ยินมาก่อน ดังนั้นให้เริ่มศึกษาหัวข้อเหล่านี้ตามลำดับจากน้อยไปหามาก

หากคุณไม่เสริมความรู้หลังจากเรียนรู้สิ่งใหม่ คุณจะลืมทุกสิ่งอย่างรวดเร็ว
ฉันขอแนะนำว่าหลังจากที่คุณเรียนรู้อัลกอริทึมใหม่แล้ว ให้นำไปใช้ในทางปฏิบัติ ทำงานผ่าน 2-3 งาน ค้นหาแท็กอัลกอริทึมใน SPOJ คุณจะพบปัญหาที่ต้องใช้อัลกอริทึมนี้ในการแก้ไข แก้ไขปัญหาเหล่านี้ก่อน

การเขียนโปรแกรมไดนามิกระดับปรมาจารย์เพราะมันจะนำคุณไปสู่ชัยชนะ
จากประสบการณ์ของผม ทุกการแข่งขันย่อมมีปัญหาอย่างน้อยหนึ่งข้อ การเขียนโปรแกรมแบบไดนามิก. หลายๆ คนคงปวดหัวเมื่อได้ยินคำว่า "Dynamic Programming" เพราะพวกเขาไม่เข้าใจเลย

และนี่เป็นสิ่งที่ดี เพราะถ้าคุณเข้าใจการเขียนโปรแกรมแบบไดนามิก คุณจะชนะ

ฉันชอบการเขียนโปรแกรมแบบไดนามิก มันเป็นหัวข้อโปรดของฉัน เคล็ดลับของการเขียนโปรแกรมแบบไดนามิกคือการตัดสินใจที่เหมาะสมที่สุดในระดับสากล ไม่ใช่แค่เฉพาะในท้องถิ่นเท่านั้น คุณต้องแยกปัญหาออกเป็นปัญหาย่อยที่ง่ายกว่า แก้ไขปัญหาย่อยแต่ละข้อเหล่านี้เพียงครั้งเดียว จากนั้นสร้างโซลูชันที่รวมปัญหาย่อยที่แก้ไขแล้วเข้าด้วยกัน อัลกอริธึมโลภ - ตรงกันข้ามกับการเขียนโปรแกรมแบบไดนามิก จำเป็นต้องมีการตัดสินใจเลือกที่เหมาะสมที่สุดในท้องถิ่นในแต่ละขั้นตอน และทางเลือกที่เหมาะสมที่สุดในท้องถิ่นอาจนำไปสู่วิธีแก้ปัญหาระดับโลกที่ไม่ดีได้

ในขณะที่เรียนรู้แนวคิดใหม่ๆ ให้ลองดู บทช่วยสอน TopCoder. มีรายละเอียดและเข้าใจได้ดีมาก ขอบคุณพวกเขาที่ทำให้ฉันสามารถเข้าใจได้ ต้นไม้ที่จัดทำดัชนีไบนารี.

ทำงานหนัก

คุณเคยได้ยินเกี่ยวกับนักกีฬาที่ชนะการแข่งขันกีฬาโอลิมปิกโดยไม่ต้องฝึกฝนนานหลายปีหรือไม่? ฉันไม่.

ทุกปี การเตรียมการสำหรับการแข่งขันคอมพิวเตอร์โอลิมปิกจะเริ่มในเดือนกันยายนและสิ้นสุดในเดือนเมษายน

ทุกวันตลอด 8 เดือนนี้ ฉันฝึกซ้อมเป็นเวลา 5 ชั่วโมง

ใช่ ฉันใช้เวลา 5 ชั่วโมงนี้เพียงแก้ปัญหาอัลกอริทึมเท่านั้น ฉันจำวันที่ฉันฝึกซ้อม 8 หรือ 10 ชั่วโมงได้ ทำไม เพราะฉันชอบมัน ทุกวันเมื่อฉันกลับจากโรงเรียน ฉันจะตรงไปที่ห้องนอน นั่งหน้าคอมพิวเตอร์ และเริ่มวิเคราะห์ปัญหาใหม่ หรือฉันกำลังเรียนรู้อัลกอริทึมใหม่ที่ฉันจำเป็นต้องรู้เพื่อแก้ไขปัญหานี้

หากคุณต้องการชนะคุณต้องทำเช่นเดียวกัน เลือกปัญหาและยึดติดกับมัน ลองคิดดูขณะเดินไปซุปเปอร์มาร์เก็ตหรือขณะขับรถ

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

คุณรู้ไหมว่าเมื่อคุณนอนหลับ สมองของคุณจะจัดเรียงข้อมูลที่รวบรวมในวันนั้น ดูเหมือนเขาจะวางหนังสือเรียงตามลำดับตัวอักษรบนชั้นหนังสือ โดยพื้นฐานแล้ว สมองของคุณคิดถึงปัญหาต่างๆ ที่คุณกำลังเผชิญอยู่

สามารถใช้ได้อย่างชำนาญ ก่อนเข้านอน ให้อ่านปัญหายากๆ และจำไว้ว่าต้องทำอย่างไรจึงจะแก้ปัญหาได้ ในขั้นตอนนี้ คุณไม่จำเป็นต้องมองหาวิธีแก้ปัญหาด้วยตนเอง ไปนอนซะ. สมองของคุณจะเริ่มประมวลผลปัญหานี้ เมื่อคุณตื่นขึ้น คุณจะประหลาดใจเมื่อพบว่าคุณพบวิธีแก้ปัญหาในขณะที่คุณหลับ

ลองด้วยตัวเอง มันเหมือนกับเวทมนตร์

ฉันสร้างบล็อกวิดีโอ

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

ย่อหน้าสั้นๆ นี้ไม่เกี่ยวข้องกับรายการกีฬา หากคุณอายุยี่สิบและสงสัยว่าฉันมองโลกอย่างไร คุณอาจต้องการลองดู บล็อกวิดีโอของฉันบน Youtube. ฉันพูดถึงโลก ชีวิต และวิทยาการคอมพิวเตอร์ในนั้น

ทำงานอย่างชาญฉลาด

นี่คือความลับของความสำเร็จ คุณต้องมีเป้าหมาย

เราเป็นคนและเราชอบมัน ผัดวันประกันพรุ่ง. เรามักจะต้องการเลื่อนสิ่งที่ต้องทำออกไปในตอนนี้ การรับชม Netflix นั้นสนุกกว่าการจัดการกับปัญหาการเขียนโปรแกรมแบบไดนามิกเสมอ คุณรู้สิ่งนี้และคุณต้องแก้ไข

วิธีเอาชนะการผัดวันประกันพรุ่ง

ตั้งเป้าหมายให้ตัวเอง. คุณจะพบปัญหาที่น่าสนใจซึ่งคุณสามารถเรียนรู้สิ่งใหม่ๆ อยู่เสมอ (ตรวจสอบแหล่งข้อมูลที่ฉันกล่าวถึงข้างต้น) แต่ปัญหาเหล่านี้จำเป็นต้องแก้ไข ไม่ใช่แค่อ่านเฉยๆ

ต่อไปนี้คือวิธีที่ฉันเอาชนะการผัดวันประกันพรุ่ง ฉันเริ่มปฏิทินกระดาษและในแต่ละวันเต็มไปด้วยปัญหาที่ฉันต้องการแก้ไข ฉันมักจะกรอกปัญหาล่วงหน้าสองวันเสมอ ฉันจึงรู้จักบริหารเวลาในวันต่อๆ ไป

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร

ดังนั้นฉันจึงมีแรงบันดาลใจอยู่เสมอ ฉันจำเป็นต้องแก้ไขปัญหาบางอย่างและค้นหาปัญหาใหม่เพื่อเติมเต็มในวันถัดไปในปฏิทิน การข้ามปัญหาที่ได้รับการแก้ไขแล้วรู้สึกดีมาก ฉันรู้ว่าคุณก็ชอบมันเช่นกัน

รับปฏิทินกระดาษของคุณเอง อย่าสร้างรายการสิ่งที่ต้องทำในโทรศัพท์ของคุณซึ่งคุณจะลืมวันพรุ่งนี้

วิธีแก้จุดบกพร่องอย่างมีประสิทธิภาพ

คุณต้องการที่จะเป็นมืออาชีพหรือไม่? ถ้าใช่ คุณต้อง "แก้ไขข้อบกพร่องในใจ"
นี่เป็นเทคนิคการดีบักที่มีประสิทธิภาพที่สุดที่ฉันรู้จัก เนื่องจากไม่จำเป็นต้องใช้ดีบักเกอร์เลย สมองของคุณจะตรวจสอบสาขาโค้ดหลายสาขาพร้อมกันและให้ภาพรวมของโค้ดที่กว้างกว่ามากเมื่อเทียบกับ ดีบักเกอร์แบบคลาสสิก.

คุณสามารถเปรียบเทียบตัวเองกับปรมาจารย์ที่เล่นหมากรุกและคิดล่วงหน้า 3 ประการ

ฉันใช้เทคนิคนี้เป็นแนวป้องกันเริ่มต้นเท่านั้น จากนั้นฉันก็ใช้ดีบักเกอร์จริง

หากต้องการเรียนรู้วิธีแก้ไขจุดบกพร่องในหัว คุณต้องฝึกฝน เมื่อคุณตรวจสอบวิธีแก้ไขปัญหาและได้รับ "คำตอบที่ผิด" อย่าไปที่ปุ่มดีบักเกอร์โดยตรง อ่านโค้ดซ้ำแล้วคิดว่า: "เกิดอะไรขึ้นในบรรทัดนี้", "ถ้า" ที่นี่ส่งผลต่อโปรแกรมอย่างไร, "เมื่อเราออกจากลูป ค่าของตัววนซ้ำจะเป็นเท่าใด"

วิธีนี้คุณคิดไปเอง เมื่อเวลาผ่านไป คุณจะได้เรียนรู้การเขียนโค้ดและแก้ไขข้อบกพร่องได้ทันที

เกี่ยวกับผู้แต่ง

ฉันได้รับรางวัล 3 ใน 4 เหรียญทองจากการแข่งขันคอมพิวเตอร์โอลิมปิกได้อย่างไร
Andrei Margeloiu เป็นโปรแกรมเมอร์ตัวยงที่มีความสนใจในการเป็นผู้ประกอบการ สตาร์ทอัพ และกิจกรรมกลางแจ้ง คุณสามารถติดต่อเขาได้ บน LinkedIn.

การแปล: ไดอาน่า เชเรเมียวา

ที่มา: will.com

เพิ่มความคิดเห็น