2010-08-04 5 views
3

x 단위로 숫자를 배포 할 방법을 찾고 있습니다. 이 단어를 어떻게 쓰는지 모르겠으므로 예제를 드리겠습니다.토너먼트 시스템에 대한 상품 배포

총상금이 $ 1000 인 토너먼트가 있습니다. 나는 상위 20 위너/참가자가 그 중 하나에서 우승 할 수 있기를 바랍니다.
나는 수학적 알고리즘/수식을 필요로한다.이 알고리즘/수식은 그 선수들 사이에서 그것을 분산시킬 것이고, 분배의 다른 요인을 제어 할 수있는 힘을 준다.

예를 들어, 1 위를 차지한 승자가 300 달러를 받길 원합니다. 상위 2 위 승자는 그 중 적은 비율을 차지합니다. 총 분포는 적어도 X $를 얻는 상위 20 위 (마지막 것)까지 모두에게 무언가를 제공해야합니다.
X $는 제가 제어하고자하는 또 다른 요소입니다.

아이디어가 있으십니까? 이 문제는 이름이 있습니까 (그리고 그 이름은 무엇입니까?)? 모든 코드 예제?

편집 # 1 - 처음 제안 : 이것은 지금까지 내가 도달 할 수 같습니다

#include <conio.h> 
#include <vector> 

#define TOTAL      100 
#define WINNERS      15 
#define FIRST_WINNER_PERCENTAGE  0.30 

void distribute_1(::std::vector<double> * const prizes) 
{ 
    prizes->clear(); 

    double total = TOTAL; 
    double winning_percentage = FIRST_WINNER_PERCENTAGE; 
    double slope = 0.5; 
    int winners = WINNERS; 

    double winning = 0; 
    for(int i = 0; i < winners; i++, total -= winning, winning_percentage /= 2) 
    { 
     winning = total * winning_percentage; 
     prizes->push_back(winning); 
    } 
} 
void distribute_2(::std::vector<double> * const prizes) 
{ 
    prizes->clear(); 

    double total = TOTAL; 
    double winning_percentage = FIRST_WINNER_PERCENTAGE; 
    double slope = 0.5; 
    int winners = WINNERS; 

    double winning = 0; 
    for(int i = 0; i < winners; i++, total -= winning/*, winning_percentage /= 2*/) 
    { 
     winning = total * winning_percentage; 
     prizes->push_back(winning); 
    } 
} 
void distribute_3(::std::vector<double> * const prizes) 
{ 
    prizes->clear(); 

    double total = TOTAL; 
    double winning_percentage = FIRST_WINNER_PERCENTAGE; 
    double slope = 0.0005; 
    int winners = WINNERS; 

    double winning = 0; 
    for(int i = 0; i < winners; i++, total -= winning, winning_percentage -= slope) 
    { 
     winning = total * winning_percentage; 
     prizes->push_back(winning); 
    } 
} 
void distribute_4(::std::vector<double> * const prizes) 
{ 
    prizes->clear(); 

    double total = TOTAL; 
    double winning_percentage = FIRST_WINNER_PERCENTAGE; 
    double slope = 1/WINNERS; 
    int winners = WINNERS; 

    double winning = 0; 
    for(int i = 0; i < winners; i++, total -= winning, winning_percentage -= slope) 
    { 
     winning = total * winning_percentage; 
     prizes->push_back(winning); 
    } 
} 

void main() 
{ 
    ::std::vector<double> prizes; 

    distribute_1(&prizes); 
    distribute_2(&prizes); 
    distribute_3(&prizes); 
    distribute_4(&prizes); 

    double total_granted = 0; 
    for(int i = 0; i < WINNERS; i++) 
    { 
     total_granted += prizes[i]; 
     printf("%lf\n", prizes[i]); 
    } 
    printf("-\n%lf\n", total_granted); 

    _getch(); 
} 

. 이 문제는 예를 들어, 'WINNERS'를 5로 설정하면 알고리즘이 '총'(이 예에서는 100) 또는 더 가까이 (총 83 개)에 도달하지 못하는 경우입니다. .

Cristy의 솔루션 :

#include <conio.h> 
#include<iostream> 
//using arithmetic progression 
using namespace std; 
int i; 
float ratio; 
float first_prize; 
float s; 
int main() 
{ 
    float money=1000; 
    const int total_prizes =  10; 
    float last_prize =    99; 
    float prizes[total_prizes+1]; 

    /**/first_prize=2*money/total_prizes-last_prize; //last member of the progresion 
    ratio=(first_prize-last_prize)/(total_prizes-1); 
    prizes[total_prizes]=last_prize; 
    for(i=total_prizes-1;i>=1;i--){ 
     prizes[i]=prizes[i+1]+ratio; 
     money-=prizes[i]; 
    } 
    for(i=1;i<=total_prizes;i++){ 
     printf("%d) %.2f\n",i,prizes[i]); 
     s+=prizes[i]; 
    } 
    printf("TOTAL SUM:%.2f\n",s); 
    printf("Ratio: %.2f", ratio); 
    _getch(); 
} 
+0

더 많은 제약이 없으면 알고리즘을 정의 할 수 없습니다! 어떤 종류의 배포판을 원하십니까? 선의? 이차성? 다른 것? –

+1

문자 그대로 수많은 방법으로이 작업을 수행 할 수 있으며이 단계에서는 실제로 프로그래밍 관련 질문이 아닙니다. 또한 – torak

+0

, 위에서 언급 한 두 가지 요소는 나는 내가 "기세"로 정의 할 또 다른 요소를 제어하고 싶습니다 외에 다음 # 20 (마지막)로 1 위 수상자에서, 경품은 줄일 수있는 스테핑. – Poni

답변

3

여기 1:15 AM이고 저는 수학을 해결하고 있습니다 :)).
산술 진행 사용.
나는 쉽게 정의 할 수 있도록 정의를 사용하여 모두 만들었습니다.

#include<iostream> 
//using arithmetic progression 
using namespace std; 
FILE *g=fopen("output.out","w"); 
#define last_prize 10 
#define total_prizes 20 
int i; 
float prizes[total_prizes+1]; 
float money=1000; 
float ratio; 
float first_prize; 
float s; 
//a1=last_prize 
//an=first_prize 
int main(){ 
first_prize=2*money/total_prizes+last_prize; //last member of the progresion 
ratio=(first_prize-last_prize)/(total_prizes-1); 
prizes[total_prizes]=last_prize; 
    for(i=total_prizes-1;i>=1;i--) 
     prizes[i]=prizes[i+1]+ratio; 
for(i=1;i<=total_prizes;i++){ 
    fprintf(g,"%d) %.2f\n",i,prizes[i]); 
    s+=prizes[i]; 
} 
fprintf(g,"TOTAL SUM:%.2f",s); 
return 0; 
} 

출력 : D

기타 결과 :
INPUT :

#define last_prize 30 
#define total_prizes 5 

출력 :

당신은 그들이 정확히 1000.00 $로 정리해 볼 수 있듯이

1) 90.00 
2) 85.79 
3) 81.58 
4) 77.37 
5) 73.16 
6) 68.95 
7) 64.74 
8) 60.53 
9) 56.32 
10) 52.11 
11) 47.89 
12) 43.68 
13) 39.47 
14) 35.26 
15) 31.05 
16) 26.84 
17) 22.63 
18) 18.42 
19) 14.21 
20) 10.00 
TOTAL SUM:1000.00 

1) 370.00 
2) 285.00 
3) 200.00 
4) 115.00 
5) 30.00 
TOTAL SUM:1000.00 
+0

더 나은 그것을 배포 할 수 있습니다 !!!!. ! @ # $ # @ 당신은 그냥 내 얼굴에 THISSSSS 큰 웃음을 넣었습니다 !!!!!!!!!를! 그것은 당신이 살고 어디 여기뿐만 아니라에서!? 다시 말하지만, 정말 감사합니다 1시 15분입니다 어떤 단어가 그것을 표현하지 않으려면 내가 (밤의 나머지를 통해 재생/코드를 배울거야!!? 난 당신이 바로 – Poni

+0

예 http://en.wikipedia.org/wiki/Arithmetic_sequence의 공식을 구현 이해, 2 formulaes from there. 루마니아에 살고 있습니다. :) 나는 잠을 자러 갈 것입니다.이 코드와 아무런 상관 관계가 없으며 알고리즘을 만들고 싶습니다. D 코드에 anyhing이 있으면 이해할 수없는 것입니다. 질문 을 좋은 밤 – Cristy

+0

문제를 다음과 같은 제약 조건 :.!.. 돈 = 1000 last_prize = 100 total_pri zes = 20. # 1 승자는 0이됩니다. # 19는 94.74를 얻습니다. # 20은 100이됩니다. 어떤 방법 으로든 해결할 수 있습니까? 어쩌면 내일? (: 멋진 밤을 보내십시오! – Poni

1

나는 풀에 대한이 문제를 가지고 있었다 - 나는 상대적으로 동일한 비율 (70 %/20 %/10 %)가 개별 상품의 3 단계를 원하지만, 인식 유대 관계가 확연히 드러났기 때문에이를 설명해야했습니다. 두 번째 유나이티드로 끝날 수도 있고 개인 2 위 수상자가 3 위 수상자보다 적어지기 때문에 팟을 나누어 수상하지 않을 것입니다.

P (I)() P (I) * N (I) I 위에 승자

1) 합계의 상 N (I) = 번호 = 사이즈 = $ (1000)

2) P (1)/P (2) = 20분의 70

3) P (2)/P (3) = 20/10 제 경우

, 3 개의 미지수의 수식 3 - I 해결 얻을 독특한 솔루션.

예를 들어 P (1) = 300 달러입니다. 나는 단지 상품의 연속 비율을 지정하고 방정식의 선형 시스템을 해결할 것입니다.

또한 최근 British Open Championship에서 골프 상품을 배포하려면 here을 고려하십시오. 저는 PGA가이 웹 사이트의 재능보다 더 훌륭하게 일할 수 있다고 말하지는 않습니다 만, 실제로 귀하의 질문을 시연합니다.

+0

알았어. 코드로 시연 해 주시겠습니까? – Poni

+0

사실 그것은 알고리즘이 아니라 문제에 대한 대수적 솔루션이므로 쉽게 코딩 할 수 없습니다. n 개의 미지수로 n 개의 방정식으로 문제를 공식화하면 일반 선형 대수학 솔버로 각 미지수를 풀 수 있습니다. – Grembo

2

같은 간단한 공식을 만들 수 있습니다.

#include<iostream> 
using namespace std; 
FILE *g=fopen("output.out","w"); 
int i; 
int prizes[21]; 
int money=1000; 
int main(){ 
    for(i=1;i<=20;i++){ 
     prizes[i]=(float)(15+(20-i))/100*money; 
     money-=prizes[i]; 
    fprintf(g,"%d) %d\n",i,prizes[i]); 
     } 
return 0; 
} 

이 출력됩니다 :

1) 340 
2) 217 
3) 141 
4) 93 
5) 62 
6) 42 
7) 29 
8) 20 
9) 14 
10) 10 
11) 7 
12) 5 
13) 4 
14) 3 
15) 2 
16) 2 
17) 1 
18) 1 
19) 1 
20) 0 

그러나 당신은 당신이 :) 싶습니다 아무것도 값을 변경할 수 있습니다.
이 방법을 사용하면 쉽게 &이라고 할 수 있습니다.

이 알고리즘의 시작 ideea의이었다 :
1 상 : 모든 돈 ($ 1000) = ~ 30 % 330 $
2 상 : 나머지 30 % (670 $) = ~ 201
3 등 : 나머지 30 % ... 등 ...
20 (15+ (20-i))을 20으로 바꾸면
출력이 달라집니다. 다른 값을 얻으려면 값을 변경하십시오.

1) 200 
2) 160 
3) 128 
4) 102 
5) 82 
6) 65 
7) 52 
8) 42 
9) 33 
10) 27 
11) 21 
12) 17 
13) 14 
14) 11 
15) 9 
16) 7 
17) 6 
18) 4 
19) 4 
20) 3 

편집 : 그리고 한 가지 더. 해당 알고리즘을 사용하여 모든 돈을 분할 한 후에도 나머지 돈이 남아있을 수 있습니다 (마지막 하나는 나머지 금액에서 x %를 얻음). 왼쪽 자리를 첫 번째 자리에 추가 할 수 있습니다 ...

+1

아주 좋은 Cristy 덕분에, 아직 모든 조합에서 잘 작동하지 않습니다. 또한 1000까지 합계 된 값을 생성합니다 (또는 닫으면 두 번째 출력의 총 합이 약 980과 약간입니다). 내 편집에서 말했듯이 – Poni

+0

@Poni, 당신은 그냥 농담 약간의 위스키를 :))() 구입하는 데 사용할 수있는 남은 돈이있을 수 있습니다. 돈을 첫 번째 장소에 추가하십시오. 이것은 단순한 동위 원소 일뿐입니다. 좀 더 복잡한 것을 원한다면이 문제 (수학/기하학 진화 또는 그와 유사한 것)를 수학적으로 풀어 봐야합니다. – Cristy

+0

OP에 대한 편집을 확인하십시오. 당신은 더 나은 솔루션 (로 얻을 수 있습니다! 다시 한번 감사, 정말 그것을 해결하기 위해, 그 일을하기 전에, 아직 내가 시도 할 것이다 당신의 편집에 동의 – Poni

0

한다고 가정 총 비용 M, 당신은 첫 번째 사람이 두 번째보다 더 K 시간을 얻을 것이다하도록 n 개의 풀에 배포 원하는 초 K 시간이 1/3 이상 등 더 가져옵니다. 마지막으로 x 금액을 얻는다 고 가정하십시오.

x + k * x + k^2 * x ... k (n-1) * x = M x (k^n-1)/(k- 1) =

M은 선택하고 잘못된 Cristy의 첫 줄

0

화학식 :-) 돈 (k)의 분산 값에 기초하여이 식 (X)에 대한 해결. first_prize = 2 * money/total_prizes + last_prize; first_prize = 2 * money/total_prizes - last_prize이어야합니다.

여기 파이썬에서 내 솔루션이 최고 수상자에 잔여 금액을 추가합니다.

starting_amount = (((winnings * 2)/float(no_of_winners)) - last_amount) 

difference = (last_amount - starting_amount)/float(no_of_winners - 1) 
for rank in range(1, no_of_winners + 1): 
    reward = starting_amount + difference * (rank - 1) 
    reward = round_amount(reward) 
    winnings -= reward 
    winning_amount[rank] = reward 

residual_winnings = winnings 
residual_shares = {1: 0.5, 2: 0.3, 3: 0.2} 

if no_of_winners < 3: 
    winning_amount[1] += residual_winnings 
else: 
    for rank in residual_shares: 
     reward = residual_winnings * residual_shares[rank] 
     reward = round_amount(reward) 
     winning_amount[rank] += reward