2017-09-08 2 views
-6

문제 설명 :
사친은 과자를 아주 좋아합니다. 그래서 그는 과자 시장에 간다. 달콤한 포장 마차가 있습니다. 모든 달콤한 포장 마차는 과자가 다릅니다. 시간을 절약하기 위해 그는 연속 된 포장 마차에서 과자를 사기로 결정했습니다. 그래서, 그는 그가 원하는만큼 많은 매점에서 살 수 있지만, 모든 매점은 인접 해 있어야합니다. 그는 또한 각 포장 마차에서 단 1kg의 과자를 사기로 결정했습니다. 각 실속을위한 과자 1 킬로그램의 비용이 주어집니다. 저 시장 안에 청구의 이상한 규칙 있는다. 그리고 그 규칙은 다음과 같습니다 - 모든 과자 구매의 총 비용은 모든 과자의 비용과 그가 구입 한 달콤한 비용을 곱한 값입니다. 예 : 과자의 총 비용보다 같은 순서로 2, 3, 4의 가격을 가진 과자를 사면 2 * 4 + 3 * 4 + 4 * 4 = 36이됩니다. 이제 그는 과자를 사기위한 가능한 모든 방법의 총비용이 무엇인지 궁금합니다. 당신은 그를 도울 수 있습니까? 이 숫자가 클 수 있으므로 최종 결과의 모듈러스를 10^9 + 7로 가져와야합니다.

샘플 테스트 케이스 1오류가 발생하는 이유

Input 
    3 
    1 
    2 
    3 

    Output 
    53 

    Explanation 
    Possible ways of buying sweets are- 
    a) 1 
    b) 1 2 
    c) 2 
    d) 1 2 3 
    e) 2 3 
    f) 3 
    cost of each of these is following- 
    a) 1*1= 1 
    b) 1*2+2*2= 6 
    c) 2*2= 4 
    d) 1*3+2*3+3*3= 18 
    e) 2*3+3*3= 15 
    f) 3*3= 9 

나는 여전히 내가 경쟁 :(

import sys 
    import os 


    def possibleways(input1): 
     t1 = [] 
     s = 0 
     big_num = 10**9 + 7 
     for i in range(len(input1)): 
      for j in range(i + 1, len(input1) + 1): 
       l1 = [] 
       for k in range(i, j): 
        l1.append(input1[k]) 
       t1.append(l1) 
     # print(t1) 
     for x in t1: 
      last_element = x[-1] 
      # print("last_element", last_element) 
      s += (sum(x) * last_element) % big_num 
      # print(s) 
     return s % big_num 
     # return ts 


    ip1_cnt = 0 
    ip1_cnt = int(input()) 
    ip1_i = 0 
    ip1 = [] 
    while ip1_i < ip1_cnt: 
     ip1_item = int(input()) 
     ip1.append(ip1_item) 
     ip1_i += 1 

    output = possibleways(ip1) 
    print(str(output)) 

은 내가 실수를 찾기 위해 도와주세요 0을 얻고,이 코드를 사용하여이 문제를 해결 하고있는 것

+0

하위 구성이 너무 느리며 엄청난 양의 메모리를 사용합니다. (입력 값은 100,000입니다.) – molbdnilo

+0

@molbdnilo 어떻게 최적화 할 수 있습니까? 나 좀 도와 주실 래요? –

답변

0

나는 이해한다 :
가격이 a, b 및 c라고 가정 해 보겠습니다.
이제 우리는 모든 제품의 총 가격이 "x"
이라고 가정합니다.이 숫자는 가능한 가격 인 과 같기 때문에 찾고있는 번호는 "ax + bx + cx"입니다. a + b + c) x => x * x 그래서 숫자 목록을받은 경우 을 합한 다음 "x"를 얻으면 나머지는 아는가?

0

마지막 실속에서 뒤로 작업하는 경우 문제가 단순화 될 수 있습니다. 우리가 다른 포장 마차에 참석 한 모든 가능한 조합을 발견 (우리가 뒤쪽으로 작업하는대로) '마지막 스톨'를 제거함으로써

import itertools 

test = [3,1,2,3] 

cum_cost = 0 

for num_visits in range(1,len(test)+1): 
    print('Number of Visits: ',num_visits) 
    for end_stall in test: 
     print('\tEnd Stall',end_stall) 
     remaining_stalls = test[:] 
     remaining_stalls.remove(end_stall) 
     visits_left = num_visits - 1 
     stalls_left = len(remaining_stalls) 
     perms = itertools.permutations(remaining_stalls,visits_left) 
     perms1, perms2 = itertools.tee(perms) 
     p = [perm for perm in perms1] 
     s = sum([sum(perm)+end_stall for perm in perms2])*end_stall 
     print('\t\tVisits left',visits_left) 
     print('\t\tStalls left',stalls_left) 
     print('\t\tpermutations',p) 
     print('\t\tSum',s,' Running Sum',cum_cost) 
     cum_cost+=s 
    print('\n') 
print('Grand Total',cum_cost) 

다음 코드를 살펴 보자. 그런 다음 각각의 비용을 계산하여 누적 합계에 추가 할 수 있습니다.

0
int possibleways(int input1_size,int *input1) 
{ 

    unsigned int pow_set_size = pow(2, input1_size); 
    int counter, j; 

    for(counter = 0; counter < pow_set_size; counter++) 
    { 
     for(j = 0; j < set_size; j++) 
     { 
      /* Check if jth bit in the counter is set 
      If set then pront jth element from set */ 
      if(counter & (1<<j)) 
      printf("%d", input1[j]); 
     } 
     printf("\n"); 
    } 
} 


// I wrote this code it showed the output still , I got 0 in exam competition. 
0

내 코드는 문제를 해결할 것이고 그렇게 크지 않을 것입니다. (파이썬 버전 3.6.2)

length = int(input()) 
if (length >=1 and length <= 10^5): 
    shop = list(map(int, input().strip())) 
Sum = 0 
flag = len(shop) 
while (flag != 0): 
    for i in range(len(shop),0,-1): 
     Shop = shop[i-1:] 
     l= len(Shop) 
     for _ in Shop: 
      Sum = Sum + _*Shop[l-1] 
    shop.pop() 
    flag = len(shop) 
print(Sum) 
관련 문제