장난감 가게 수익


15

이야기

"2016? 알 .. 맞아"장난감 판매업 자 힐버트가 그는 눈을 뜨고 귀에서 샐러드 드레싱을 닦아내고 아침 킥 스타트 크림을 먹었습니다. 모범적 인 휴일. 그는 지금 일하러 가고 회계를 마쳐야합니다.

크리스마스는 특히 그의 판매 기간 동안 매우 수익률이 높은 기간입니다. 힐버트 (Hilbert)는 그것이 어떻게 작동하는지 정확히 알고 있습니다 : 한 사람이 가게에 들어 와서 그들이 제공하는 첫 선물을 구입합니다. 그들은 그것을 지불하고 다른 상점으로 도망갑니다. 실제로 선물이 실제로 무엇을 의미 하는가 실제로 차이를 만들지 않습니다. 가격이 너무 높지 않으면 가격도 관련이 없습니다. 크리스마스까지 남은 시간에 따라 달라집니다. 시간이 짧을수록 고객의 변심이 커질수록 지불하고자하는 가격이 높아집니다.

힐버트가 시계를 보는 것만으로도 고객이 얼마를 소비 할 수 있는지 즉시 알 수 있습니다. 그는이 사실을 쉽게 활용할 수 있습니다. 그는 주어진 고객에게 팔 수있는 가장 비싼 선물을 찾아서 그에게 제공합니다. 그는 작년에이 교활한 전략을 사용하는 것을 잊었 음을 깨달았습니다. 그래도 바뀔거야!

그럼에도 불구하고, 힐버트는 실제로 그의 위대한 계획을 사용했다면 그의 사업이 얼마나 번성했는지를 알고 싶어합니다. 그는 매장에 온 사람들의 명단을 정리했지만, 얼마나 많은 돈을 벌 었는지 확신 할 수 없습니다.

당신의 작업 (TL; DR)

입력은 사용 가능한 선물 가격의 오름차순 목록과 고객 예산 목록으로 구성됩니다. 예산 목록은 고객이 상점에 도착한 순서와 동일하며 모든 고객이 적어도 이전 금액만큼 지불 할 의향이 있으며 이는 또한 오름차순임을 의미합니다.

각 고객마다 지불하고자하는 가장 비싼 선물을 찾아서 가격을 산출하십시오. 예산 내에서 선물을 사용할 수없는 경우 a를 출력하십시오 0.

당신은 얻을 -40%알고리즘의 점근 시간 복잡도 인 경우, 문자 보너스를 O(n+m)(오히려 사소한보다 O(n*m)) 경우 n, m입력 목록의 길이이다.

이것은 이며 가장 짧은 바이트 수입니다. 표준 허점은 금지되어 있습니다.

입력:

1 2 2 2 5 7 10 20
1 1 2 3 6 6 15 21 21 22

산출:

1 0 2 2 5 2 10 20 7 0

이 작업은 지역 프로그래밍 대회에서 가져 와서 영어로 번역했습니다. 원래 과제는 다음과 같습니다. https://www.ksp.sk/ulohy/zadania/1131/


9
보너스는 도전 과제를 작성할 때 피해야 할 한 가지 입니다. 그러나 나는 이것이 좋을 것이라고 생각합니다. 유지하려면 백분율 기반 보너스로 변경하는 것이 좋습니다. 20 자 보너스는 Java 제출에 아무런 의미가 없지만 기본적으로 골프 언어 솔루션의 경우 필수입니다.
Denker

배경 이야기만으로 OP에 현상금을 수여 할 수 있습니까? 솔직히, 그것은 나를 웃게 만들었습니다. 모든 도전에는 그 중 하나가 필요합니다.
고양이

@tac 감사합니다, 그러나 하단의 작은 텍스트에서 언급했듯이, 나는 실제로 뒷이야기를 구성하지 않았습니다-나는 그것을 번역했습니다.
sammko

@sammko 그렇습니다, 나는 그것을 보았다, 그러나 나의 위의 의견은 여전히 ​​보유하고있다 :)
cat

답변:


5

Pyth, 17 16 바이트

Pietu1998 덕분에 1 바이트

VE=.-Q]
e|fgNTQ0

데모

설명:

VE=.-Q]<\n>e|fgNTQ0
                        Implicit: Q is the list of prices.
VE                      For N in the list of budgets
             f   Q      Filter the list of prices
              gNT       On the current person's budget being >= that price
            |     0     If there aren't any, use 0 instead.
          e             Take the last (most expensive) value.
      <\n>              Print it out.
  =.-Q                  Remove it from the list of prices.

VE=.-Q]\ n으로 1 바이트를 절약 할 수 있다고 생각합니다 e|fgNTQ0. 기본적으로 동일하지만 루프가 있습니다.
PurkkaKoodari

4

하스켈, 67 바이트

a#(b:c)|(h,t)<-span(<=b)a=last(0:h):(init(h++[0|h==[]])++t)#c
_#x=x

사용 예 : [1,2,2,2,5,7,10,20] # [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

: 두 부분으로 가격을 분할 모든 가격 <= 다음 고객의 예산이며, 다른 모든입니다. 마지막 가격을 취하고 마지막 플러스 와 나머지 예산을 제외한 모든 예산을 재귀 적으로 계속 하십시오. 비어 있으면 평가합니다 . 유사 : 더미 요소를 추가 에 있다면 그 때문에, 비어 드롭 수있는 뭔가가 ( 빈리스트 실패).(h,t)hthhtlast(0:h)0hinit (h++[0|h==[]]) ++ t0hhinitinit


3

자바, 154 * 0.6 = 92.4 바이트

-13 바이트 람다 실제로 사용할 수 있기 때문에 int[],하지 Integer[](감사 BunjiquoBianco )

이것은 O (n + m) 시간과 O (n + m) 추가 공간이 필요합니다 (큰 O 표기법을 이해한다고 가정) .

g->b->{int l=g.length,L=b.length,G=0,B=0,A=0;int[]a=new int[l],s=new int[L];for(;B<L;){while(G<l&&g[G]<=b[B])a[A++]=g[G++];s[B++]=A>0?a[--A]:0;}return s;}

들여 쓰기 : ( 온라인으로 사용해보십시오! )

static int[] toyStore(int[]g,int[]b) {
    int gl=g.length,bl=b.length,gp=0,bp=0,ap=0;
    int[] a=new int[gl],s=new int[bl];
    for (;bp<bl;) {
        while(gp<gl&&g[gp]<=b[bp])a[ap++]=g[gp++];
        s[bp++]=ap>0?a[--ap]:0;
    }
    return s;
}

public static void main(String[] args)
{
    System.out.println(Arrays.toString(
        toyStore(new int[] {1,2,2,2,5,7,10,20},
                 new int[] {1,1,2,3,6,6,15,21,21,22})
        ));
}

타입 선언이 더 깨끗하고 정확히 같은 논리이기 때문에 람다가 아닌 확장을 보여줍니다. 람다는 이데온 링크에 존재한다.

설명:

사용 된 변수 :

  • g선물 가격 b목록이고 예산 목록입니다.
  • gl의 길이 gbl의 길이입니다 b.
  • a저렴한 선물용 스택이며, s판매 된 선물의 출력 배열입니다.
  • gp, bp,과 ap에 대한 포인터 g, b그리고 a각각은. bp에 대한 포인터이기도합니다 s.

연산:

  • 예산 범위 내 각 예산에 대해
    • 이 예산은에서 선물을 구입할 수 있지만 g[gp]
      • 예산을 스택에 푸시 a하고 증가gp
    • 상단의 팝업 as[bp]존재하는 경우, 다른 넣어 0.

람다를 카레 할 수 없어? (즉 (g,b)->, g->b->?
ASCII 전용

@somebody는 분명히 그렇습니다. 어떤 이유로 든 그것은 전에 나를 위해 일한 적이 없지만 지금은 그럴 것입니다. 0.o (보너스 이후 0.6 바이트를 절약했습니다.)
CAD97

입력이 길다고 가정하면 long을 사용하여 일부 바이트를 절약 할 수 있습니다. [] (158 바이트로 이동) -ideone.com/invHlc
BunjiquoBianco

1
@BunjiquoBianco 사실은 int []를 사용할 수 있습니다. 어떤 이유로 나는 타입 인수가 참조 타입을 취하기 때문에 (따라서 값 타입 프리미티브는 아닙니다)int 참조 타입 배열을 사용해야하는 아님)을 느꼈습니다. 그러나 int 배열을 사용할 수 있습니다. 기회가 생기면 업데이트하겠습니다.
CAD97

@ CAD97 하! 내가 그 링크를 만들지 않았다 믿을 수 없어 ...
BunjiquoBianco

2

하스켈, 87 * 0.6 = 52.2 바이트

g s(p:q)d@(b:c)|p<=b=g(p:s)q d
g[]p(b:c)=0:g[]p c
g(s:t)p(b:c)=s:g t p c
g _ _ _=[]
g[]

보너스를 받기 때문에 다른 답변 과 완전히 다릅니다 .

마지막 줄 (-> g[])은 정의의 일부가 아니라 호출 오버 헤드입니다. 사용 예 : g [] [1,2,2,2,5,7,10,20] [1,1,2,3,6,6,15,21,21,22]-> [1,0,2,2,5,2,10,20,7,0].

기본적으로 @ CAD97의 답변 과 같은 방식으로 작동합니다 . 즉 (처음에는 비어있는) 도우미 스택을 사용하여 구매 가능한 항목을 추적합니다. 세부 사항 : 순서대로 확인하십시오.

  • 첫 번째 가격이 첫 번째 예산보다 작거나 같으면 가격을 스택으로 이동하십시오. 다시 전화하세요.
  • 스택이 비어 있으면 예산을 뺀 상태에서 0을 반환하고 재귀 호출을 반환합니다.
  • 스택 및 예산 목록이 모두 비어 있지 않은 경우 스택 상단을 반환하고 스택 및 예산이 팝된 재귀 호출을 반환하십시오.
  • 그렇지 않으면 빈 목록을 반환하십시오.

이것은 작동합니다 m+n 시간 때문에리스트 중 하나 이상의 원소로 단축되는 재귀 호출 각각 헬퍼 스택 사용 일정한 시간과 b)에서 a) 동작.


2

젤리 , 15 바이트

ṀṄ;©®œ^
Rf@€ç/Ṁ

온라인으로 사용해보십시오!

작동 원리

ṀṄ;©®œ^  Helper link. Arguments: G, H (lists of affordable gifts)

Ṁ        Compute the maximum of G (0 if the list is empty).
 Ṅ       Print it.
  ; ®    Concatenate it with the register (initially 0).
   ©     Save the result in the register.
     œ^  Compute the multiset symmetric difference of the updated register and H.

Rf@€ç/Ṁ  Main link. Arguments: B (budgets), P (prices)

R        Range; replace each t in B with [1, ..., t].
 f@€     Intersect the list of prices with each budget range, obtaining, for each
         customer, the list of all gifts he's willing to pay for.
    ç/   Reduce the array of lists by the helper link.
         In each iteration, this computes and prints the most expensive gift for
         a customer, than removes the selected gift (and all previously
         selected gifts) from the next list.
      Ṁ  Compute the maximum of the resulting list, which corresponds to the last
         customer.

1

자바 스크립트, 85 * 0.6 = 51 바이트

f=(a,b,s=[],[t,...u]=a,[v,...w]=b)=>v?t<=v?f(u,b,[...s,t]):[s.pop()|0,...f(a),w,s)]:[]

@ CAD97의 답변에 대한 또 다른 클론.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.