พื้นหลัง
ในประเทศฝรั่งเศสและอาจจะอยู่ในส่วนที่เหลือของสหภาพยุโรปอาหารใดมีไว้เพื่อขายต้องแสดงรายการส่วนผสมที่เขียนไว้บนบรรจุภัณฑ์ของตนในน้ำหนักร้อยละหลั่น อย่างไรก็ตามไม่จำเป็นต้องระบุเปอร์เซ็นต์ที่แน่นอนยกเว้นว่ามีการเน้นส่วนประกอบโดยข้อความหรือรูปภาพบนหน้าปก
ตัวอย่างเช่นซอสมะเขือเทศใบโหระพาของฉันที่แสดงเพียงมะเขือเทศสีแดงขนาดใหญ่และใบโหระพาที่สวยงามบนบรรจุภัณฑ์มีข้อบ่งชี้ดังนี้:
ส่วนผสม:มะเขือเทศ 80%, หัวหอมเป็นชิ้น, ใบโหระพา 1.4%, เกลือทะเล, กระเทียมบด, น้ำตาลทรายดิบ, น้ำมันมะกอกบริสุทธิ์พิเศษ, พริกไทยดำ
ฟังดูน่าอร่อย แต่ ... ฉันจะกินหัวหอมมากขนาดไหนกันแน่?
ท้าทาย
เมื่อกำหนดรายการเปอร์เซ็นต์น้ำหนักตามลำดับจากมากไปหาน้อยในที่สุดก็ไม่สมบูรณ์ส่งออกรายการที่สมบูรณ์ของเปอร์เซ็นต์น้ำหนักขั้นต่ำและสูงสุดที่สามารถพบได้ในสูตร
- คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
- การป้อนข้อมูลจะมีรูปแบบที่เหมาะสมใด ๆ (อาร์เรย์ของตัวเลขหรือรายการของสตริงเป็นต้น) ค่าเศษส่วนควรได้รับการสนับสนุนอย่างน้อยหนึ่งตำแหน่งทศนิยม ร้อยละของน้ำหนักที่หายไปสามารถแสดงในลักษณะที่สอดคล้องและโปร่งใสใด ๆ (
0,'?'หรือnullเป็นต้น) คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะเชื่อมโยงกับสูตรที่ถูกต้องเสมอ ([70]และ[∅, ∅, 50]ไม่ถูกต้องเป็นต้น) - การส่งออกจะมีรูปแบบที่เหมาะสมใด ๆ (หนึ่งอาร์เรย์สำหรับทั้งสองน้อยที่สุดและมากสุดร้อยละน้ำหนักหรือรายการเดียวของ doublets เป็นต้น) เปอร์เซ็นต์ขั้นต่ำและสูงสุดสามารถอยู่ในลำดับใดก็ได้ (
[min, max]และ[max, min]ยอมรับได้ทั้งคู่) เปอร์เซ็นต์น้ำหนักที่แน่นอนไม่จำเป็นต้องประมวลผลแตกต่างจากเปอร์เซ็นต์อื่น ๆ และอาจแสดงด้วยค่าน้อยที่สุดและสูงสุดเท่ากัน
ใช้กฎมาตรฐานสำหรับการเขียนโค้ดกอล์ฟ : ขณะที่คุณพิมพ์รหัสจานพาสต้าของฉันเย็นลงดังนั้นการส่งที่สั้นที่สุดจะเป็นผู้ชนะ
ตัวอย่าง
เนื่องจากปัญหานี้ยากเกินกว่าที่จะเห็นได้อย่างรวดเร็วในครั้งแรกนี่เป็นวิธีแก้ปัญหาแบบทีละขั้นตอนของบางกรณี
[40, ∅, ∅]
ลองโทรตามลำดับxและyเปอร์เซ็นต์ที่หายไปสองอัน
- เพราะมันมาจากส่วนผสมแรกที่ 40%
xจึงไม่สามารถสูงกว่า 40% ได้[40, [?, 40], [?, ?]] - ผลรวมของเปอร์เซ็นต์ที่ขาดหายไปสองรายการนั้นจะเท่ากับ 60% เสมอ ดังนั้น:
- หาก
xใช้ค่าสูงสุดมันก็yจะใช้ค่าน้อยที่สุดซึ่งเป็น 60% - 40% = 20%[40, [?, 40], [20, ?]] - หาก
xใช้ค่าน้อยที่สุดyจะรับค่าสูงสุด แต่xต้องไม่ต่ำกว่าyดังนั้นในกรณีนี้x=y= 60% / 2 = 30%[40, [30, 40], [20, 30]]
- หาก
[70, ∅, ∅, 5, ∅]
ขอเรียกตามลำดับx, yและzสามเปอร์เซ็นต์ที่ขาดหายไป
- เปอร์เซ็นต์น้อยที่สุดและสูงสุดสำหรับ
zจำเป็นต้องอยู่ระหว่าง 0% ถึง 5% สมมติว่าz= 0% สักครู่ ผลรวมของเปอร์เซ็นต์ที่ขาดหายไปสองรายการนั้นเป็น 25% เสมอ ดังนั้น:[70, [?, ?], [?, ?], 5, [0, 5]]- หาก
yใช้ค่าต่ำสุด 5% ก็xจะใช้ค่าสูงสุดซึ่งก็คือ 25% - 5% = 20%[70, [?, 20], [5, ?], 5, [0, 5]] - หาก
yใช้ค่าสูงสุดxมันจะใช้ค่าน้อยที่สุด แต่xต้องไม่ต่ำกว่าyดังนั้นในกรณีนี้x=y= 25% / 2 = 12.5%[70, [12.5, 20], [5, 12.5], 5, [0, 5]]
- หาก
- เรามาตรวจสอบว่าทุกอย่างเรียบร้อยดีถ้าเราสมมติว่านั่น
z= 5% ผลรวมของเปอร์เซ็นต์ที่ขาดหายไปสองรายการนั้นมีค่า 20% เสมอ ดังนั้น:- หาก
yใช้ค่าต่ำสุด 5% ก็xจะใช้ค่าสูงสุดซึ่งเป็น 20% - 5% = 15% กรณีนี้รวมอยู่ในช่วงการคำนวณก่อนหน้านี้แล้ว - หาก
yใช้ค่าสูงสุดxมันจะใช้ค่าน้อยที่สุด แต่xต้องไม่ต่ำกว่าyดังนั้นในกรณีนี้x=y= 20% / 2 = 10% กรณีนี้จะรวมอยู่แล้วในช่วงก่อนหน้านี้สำหรับการคำนวณแต่ไม่ได้สำหรับyx[70, [10, 20], [5, 12.5], 5, [0, 5]]
- หาก
กรณีทดสอบ
Input: [∅]
Output: [100]
Input: [70, 30]
Output: [70, 30]
Input: [70, ∅, ∅]
Output: [70, [15, 30], [0, 15]]
Input: [40, ∅, ∅]
Output: [40, [30, 40], [20, 30]]
Input: [∅, ∅, 10]
Output: [[45, 80], [10, 45], 10]
Input: [70, ∅, ∅, ∅]
Output: [70, [10, 30], [0, 15], [0, 10]]
Input: [70, ∅, ∅, 5, ∅]
Output: [70, [10, 20], [5, 12.5], 5, [0, 5]]
Input: [30, ∅, ∅, ∅, 10, ∅, ∅, 5, ∅, ∅]
Output: [30, [10, 25], [10, 17.5], [10, 15], 10, [5, 10], [5, 10], 5, [0, 5], [0, 5]]
[40, ∅, ∅]และ[70, ∅, ∅, 5, ∅]ทำให้สิ่งต่าง ๆ ชัดเจนยิ่งขึ้น ความท้าทายควรมีความชัดเจนโดยไม่ดูกรณีทดสอบซึ่งไม่ใช่กรณีในขณะนี้ ถ้าฉันเข้าใจถูกต้องสำหรับ[40, ∅, ∅]: 60 จำเป็นสำหรับอีก 100% หารด้วยสองคน∅นี้ รายการแรก∅จะต้องมี 30 หรือสูงกว่า (ไม่เช่นนั้นรายการที่สอง∅จะอยู่เหนือซึ่งไม่น่าจะเป็นไปได้เมื่ออยู่ในลำดับ) นอกจากนี้ยังไม่สามารถจะอยู่เหนือ40ดังนั้นคนแรกที่∅กลายเป็นและที่สองกลายเป็น[30,40] [(100-40-40=)20, (100-40-30=)30]
[min,max]/ [max,min]หรือผสมกัน?
[min,max]และ[max,min]ยอมรับได้ในแนวเขต แต่เนื่องจากมันไม่สามารถนำไปสู่ผลลัพธ์ที่คลุมเครือได้ฉันจึงบอกว่าไม่เป็นไร
[70, 12, 11, 5, 2]ไม่ทำงานกับตัวอย่างที่สองของคุณ ถ้ามันไม่ทำงานต่ำสุดสำหรับการจะน้อยกว่าx 12.5