代码之家  ›  专栏  ›  技术社区  ›  Poni

为比赛系统分发奖品

  •  3
  • Poni  · 技术社区  · 14 年前

    我在找一种方法把数字分布到x个单位。我甚至不知道怎么用这个词,所以我举个例子:

    有一个总奖金为1000美元的锦标赛。我希望前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,那么这个算法就达不到“TOTAL”值(在这个例子中是100)或者更接近(我得到了83)。

    克里斯蒂的解决方案 :

    #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();
    }
    
    5 回复  |  直到 14 年前
        1
  •  4
  •   XCS    14 年前

    现在是凌晨1点15分,我正在解数学:))。

    我做了所有的定义,所以你可以很容易地改变他们。

    #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;
    }
    

    输出:

    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
    

    正如你所看到的,它们加起来正好是1000.00$:D


    输入:

    #define last_prize 30
    #define total_prizes 5
    

    输出:

    1) 370.00
    2) 285.00
    3) 200.00
    4) 115.00
    5) 30.00
    TOTAL SUM:1000.00
    
        2
  •  2
  •   XCS    14 年前

    你可以做一个简单的公式,比如。

    #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
    

    但是您可以将值更改为您想要的任何值:)。
    这只是一个快速&简单的方法。

    此算法的起始IDEA是:
    一等奖:全部奖金的30%(1000美元)=~330$
    二等奖:剩余奖金的30%(670美元)=~201

    如果你用20来代替(15+(20-i)),比如说,你得到这个输出:
    只要改变这个值就可以得到不同的结果。

    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
    

    编辑:

        3
  •  1
  •   Grembo    14 年前

    我有一个游泳池的问题-我想3个级别的个人奖品有相同的相对比例(70%/20%/10%),但承认有可能的关系,所以我必须考虑到这一点。我不想只分锅然后颁奖,因为你可能会以第二名的平局告终,而一个第二名的得奖者得到的比第三名的得奖者少。

    N(i)=获奖人数

    1) 总和(超过i)P(i)*N(i)=1000美元

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

    3) P(2)/P(3)=20/10

    here 在最近的英国公开赛上分配高尔夫球奖品。我并不是说PGA能比这个网站上的人才做得更好,但这是你的问题在行动中的一个示范。

        4
  •  0
  •   ankushb    14 年前

    假设总的钱M,你想在n个池中分配,这样第一个人得到的是第二个人的k倍,第二个人得到的是第三个人的k倍,依此类推。假设最后一个得到x个数量的钱

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

        5
  •  0
  •   Hareesh Kumar    9 年前

    克里斯蒂第一行的公式是错误的。 一等奖=2*奖金/总奖金+最后一个奖金;

    这是我在python中的解决方案,这将为顶级赢家添加剩余金额。

    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
    
        6
  •  0
  •   superstar3000    4 年前

    def self.get_prize_array(money,total_prizes)
        prizes = []  
        p = 0.7 # tweek this for distribution of payout 
        n = total_prizes
        l = money
        (1..total_prizes).each do |r|
           prizes[r-1] = ((1 - p) / (1 - p**n) * p**(r - 1)) * l   # p**n is p to the nth power
        end   
        return prizes
      end