ATM에서 현금 좀 가져와


26

작업은 간단합니다. 좀 가져 오기 1000, 500100메모를.

어떻게 요? 당신은 요청할 수 있습니다. 신용 카드를 사용할 수있는 ATM이 근처에 있으므로 은행을 강탈 할 필요가 없습니다. 그러나 귀하의 신용 한도는 업무에 충분하므로 인출에주의해야합니다.

도전

의 수를 감안할 때 1000, 500그리고 100노트 필요, 적어도 그 많은 메모를 얻기 위해 필요한 특정 인출을 계산합니다. 각 인출에서 ATM은 다음 규칙에 따라 각 메모를 내뱉을 수 있습니다.

  • 인출 된 금액 ( A)이5000
    • 인 경우 A%1000 == 0ATM은 1 개의 500노트, 5 개의 100노트 및 나머지 1000노트를 뱉습니다.
    • 그렇지 않으면 A%500 == 0ATM이 5 개의 100노트를 뱉고 나머지는 1000노트를 뱉습니다
    • 그렇지 않은 경우 A%1000 < 500는 ATM 가래침, floor(A/1000) 1000노트와 나머지 100노트
    • 그렇지 않으면 A%1000 > 500ATM이 floor(A/1000) 1000메모를 뱉고, 메모를 남기고 500나머지 100메모
  • 인출 된 금액이 다음보다 큽니다. 5000
    • 인 경우 A%1000 == 0, ATM은 2 개의 500메모를 뱉고 나머지는 1000메모합니다
    • 그렇지 않으면 A%500 == 0ATM이 1 개의 500노트를 뱉고 나머지는 1000노트를 뱉습니다
    • 그렇지 않은 경우 A%1000 < 500는 ATM 가래침, floor(A/1000) 1000노트와 나머지 100노트
    • 그렇지 않으면 A%1000 > 500ATM이 floor(A/1000) 1000메모를 뱉고, 메모를 남기고 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에 출력하거나 인수를 통해 입력을받는 함수를 작성하여 양에 해당하는 정수 목록 또는 양을 새 행으로 구분 한 문자열을 리턴 할 수 있습니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 승리합니다.


사실 @nutki. 편집했습니다.
Optimizer

속도 제한이 있습니까? 마지막 테스트 사례 21 14 2가 적절한 시간 내에 완료 되어야합니까 ?
Jakube

1
@Jakube 합리적인 시간에-예 (5-6 시간 미만). 그러나 이것이 코드 골프이기 때문에 제한이 없습니다.
Optimizer

0을 철회하면 100 개의 음표가 5 개 나옵니다.
AJMansfield

@AJMansfield는 물론 아닙니다. 0 금액을 인출 할 수 없습니다
Optimizer

답변:


7

자바 스크립트, 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

펄 5 : 223

편집하다

이 솔루션은 7K가 ATM 한도라는 잘못된 가정으로 수행되었습니다. 이것은 실제로 동적 프로그래밍이 필요하기 때문에 작업을 더 흥미롭게 만들었습니다. 가능한 한 많은 이동 패턴은 규칙적이므로 하드 코딩하기가 쉽지 않습니다. @hoffmale의 솔루션이 올바른지 모르겠지만이 라인 중 하나입니다. 슬프게도 누군가 먼저 해결책을 찾은 다음 골프 언어로 포팅되어 승리하는 또 다른 작업이 될 것입니다.

원래 솔루션보다 약간 느립니다 (그러나 100 미만의 매개 변수의 경우 여전히 1 초 미만).

#!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.