เอาเงินสดจากตู้เอทีเอ็มมาให้ฉัน


26

งานง่าย ได้รับฉันบาง1000, 500และ100บันทึก

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

ท้าทาย

ได้รับหมายเลขของ1000, 500และ100บันทึกจำเป็นต้องคำนวณถอนเฉพาะที่จำเป็นในการได้รับการบันทึกจำนวนมากอย่างน้อยผู้ ในการถอนแต่ละครั้ง ATM สามารถคายธนบัตรแต่ละใบตามกฎต่อไปนี้:

  • จำนวนเงินที่ถอน ( A) น้อยกว่า5000
    • ถ้าA%1000 == 0, จากนั้นเอทีเอ็มใช้500ธนบัตร1 ใบ, 100ธนบัตร5 ใบและ1000ธนบัตรที่เหลือ
    • มิฉะนั้นถ้าA%500 == 0ตู้ ATM แบ่ง100ธนบัตร5 ใบและพัก1000ธนบัตร
    • มิฉะนั้นA%1000 < 500ตู้ ATM จะแยกfloor(A/1000) 1000ธนบัตรและ100ธนบัตรที่เหลือ
    • มิฉะนั้นถ้าA%1000 > 500ตู้ ATM แตกfloor(A/1000) 1000ธนบัตร 1 500และ100ธนบัตรที่เหลือ
  • จำนวนเงินที่ถอนได้มีค่ามากกว่าเท่ากับ 5000
    • ถ้าA%1000 == 0เครื่อง ATM ใช้ 2 500บันทึกและพัก1000หมายเหตุ
    • หรือถ้าอื่น ๆA%500 == 0ตู้ ATM จะแยก500ธนบัตร1 ใบและ1000ธนบัตรที่เหลือ
    • มิฉะนั้นA%1000 < 500ตู้ ATM จะแยกfloor(A/1000) 1000ธนบัตรและ100ธนบัตรที่เหลือ
    • มิฉะนั้นถ้าA%1000 > 500ตู้ ATM แตกfloor(A/1000) 1000ธนบัตร 1 500และ100ธนบัตรที่เหลือ

เพื่อความชัดเจนนี่คือตารางที่สมบูรณ์ของบันทึกย่อที่ถอนออกสำหรับจำนวนเงินที่เป็นไปได้ทั้งหมด7000(คุณสามารถถอนเพิ่มเติมได้ แต่รูปแบบจะไม่เปลี่ยนแปลงในภายหลัง) ลำดับคือ<1000> <500> <100>:

 100 => 0 0 1                  2500 => 2 0 5                   4800 => 4 1 3
 200 => 0 0 2                  2600 => 2 1 1                   4900 => 4 1 4
 300 => 0 0 3                  2700 => 2 1 2                   5000 => 4 2 0
 400 => 0 0 4                  2800 => 2 1 3                   5100 => 5 0 1
 500 => 0 0 5                  2900 => 2 1 4                   5200 => 5 0 2
 600 => 0 1 1                  3000 => 2 1 5                   5300 => 5 0 3
 700 => 0 1 2                  3100 => 3 0 1                   5400 => 5 0 4
 800 => 0 1 3                  3200 => 3 0 2                   5500 => 5 1 0
 900 => 0 1 4                  3300 => 3 0 3                   5600 => 5 1 1
1000 => 0 1 5                  3400 => 3 0 4                   5700 => 5 1 2
1100 => 1 0 1                  3500 => 3 0 5                   5800 => 5 1 3
1200 => 1 0 2                  3600 => 3 1 1                   5900 => 5 1 4
1300 => 1 0 3                  3700 => 3 1 2                   6000 => 5 2 0
1400 => 1 0 4                  3800 => 3 1 3                   6100 => 6 0 1
1500 => 1 0 5                  3900 => 3 1 4                   6200 => 6 0 2
1600 => 1 1 1                  4000 => 3 1 5                   6300 => 6 0 3
1700 => 1 1 2                  4100 => 4 0 1                   6400 => 6 0 4
1800 => 1 1 3                  4200 => 4 0 2                   6500 => 6 1 0
1900 => 1 1 4                  4300 => 4 0 3                   6600 => 6 1 1
2000 => 1 1 5                  4400 => 4 0 4                   6700 => 6 1 2
2100 => 2 0 1                  4500 => 4 0 5                   6800 => 6 1 3
2200 => 2 0 2                  4600 => 4 1 1                   6900 => 6 1 4
2300 => 2 0 3                  4700 => 4 1 2                   7000 => 6 2 0
2400 => 2 0 4

รายชื่อจัดทำโดย Martin

จับ

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

อินพุต

การป้อนข้อมูลสามารถอยู่ในรูปแบบที่ดีใด ๆ สำหรับสามตัวเลขที่สอดคล้องกับจำนวนของบันทึกที่จำเป็นของค่า1000, และ500 100ไม่จำเป็นต้องอยู่ในลำดับนั้น

เอาท์พุต

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

ตัวอย่าง

อินพุต (รูปแบบ<1000> <500> <100>):

3 4 1

เอาท์พุท:

600
600
600
3600

อีกไม่กี่:

7 2 5
5000
3500

1 2 3
600
1700

21 14 2
600
600
600
1600
5000
5000
5000
5000
5000

สมมติฐาน

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

ตามปกติคุณอาจเขียนโปรแกรมอ่านอินพุตเต็มผ่าน STDIN / ARGV และพิมพ์เอาต์พุตไปยัง STDOUT หรือฟังก์ชั่นรับอินพุตผ่านอาร์กิวเมนต์และส่งคืนรายการจำนวนเต็มที่สอดคล้องกับจำนวนหรือสตริงที่มีจำนวนคั่นด้วยบรรทัดใหม่

นี่คือโค้ดกอล์ฟที่สั้นที่สุดในหน่วยไบต์



มีการ จำกัด ความเร็วหรือไม่? กรณีทดสอบสุดท้ายควร21 14 2เสร็จในเวลาที่เหมาะสมหรือไม่
Jakube

1
@Jakube ในเวลาที่เหมาะสม - ใช่ (พูดน้อยกว่า 5-6 ชั่วโมง) แต่เป็นเช่นนี้ไม่มีขีด จำกัด เช่นนี้เป็นรหัสกอล์ฟ
เครื่องมือเพิ่มประสิทธิภาพ

ดังนั้นถ้าฉันถอน 0 มันจะให้ห้า 100 โน้ต?
AJMansfield

@AJMansfield ไม่แน่นอน คุณไม่สามารถถอนจำนวน 0
เครื่องมือเพิ่มประสิทธิภาพ

คำตอบ:


7

JavaScript, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

ส่งคืนรายการจำนวนเต็มที่สอดคล้องกับจำนวนเงินที่ถอน


ลองg(5,1,1)ดู 5600หนึ่งในวิธีการแก้ปัญหาที่ดีกว่า:
jimmy23013

ควรได้รับการแก้ไขแล้ว
hoffmale

g(5,1,0)วิธีแก้ปัญหา: 5500.
jimmy23013

ตอนนี้ควรได้รับการแก้ไขด้วย ^^ ขอบคุณที่ชี้ให้เห็นว่าฉันต้องง่วงเกินไป
hoffmale

g(5,2,0)วิธีแก้ปัญหา: 6000.
jimmy23013

1

Perl 5: 223

แก้ไข

วิธีแก้ปัญหานี้เกิดขึ้นจากข้อสันนิษฐานที่ผิดว่า 7K เป็นขีด จำกัด ATM สิ่งนี้ทำให้งานน่าสนใจยิ่งขึ้นเนื่องจากต้องใช้การเขียนโปรแกรมแบบไดนามิก (รูปแบบการย้ายค่อนข้างปกติ แต่การเข้ารหัสยากจะมีแนวโน้มนานกว่าการคำนวณสดตามที่ฉันทำ) ด้วยจำนวนที่เป็นไปได้รูปแบบการย้ายจึงเป็นเรื่องปกติซึ่งเป็นเรื่องเล็กน้อยที่จะเขียนโค้ดยาก ฉันไม่รู้ว่าการแก้ปัญหาโดย @hoffmale นั้นถูกต้องหรือไม่ แต่จะอยู่ในกลุ่มเหล่านี้ น่าเศร้าที่มันจะเป็นงานอีกอย่างที่มีคนมาก่อนด้วยวิธีแก้ปัญหาและจากนั้นมันก็ถูกย้ายไปที่ภาษากอล์ฟเพื่อชัยชนะ

ช้ากว่าโซลูชันเล็กน้อย (แต่ยังคงวินาทีย่อยสำหรับพารามิเตอร์ที่ต่ำกว่า 100)

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

แก้ปัญหาได้เร็วขึ้น 259

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

ใช้ STDIN:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600

ลอง10 0 0ดู ทางออกที่ดีกว่า: 10100.
jimmy23013

@ user23013 อ๊ะฉันเข้าใจผิดคำถาม ฉันถือว่า 7k เป็นจำนวนเงินสูงสุด :( ฉันหวังว่าฉันจะสามารถแก้ไขได้
nutki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.