如何基于1个基础在一组细分中分配值

时间:2018-01-26 11:30:32

标签: python c algorithm

问题描述

我们在[1,..,4]之间有一组整数值。我们希望将特定值分配到[1,...,10]之间的不同长度的细分 1

我们在下表中显示了一个示例:

   Example Value  segments  distribution
    a       4       4          1 on each segment
    b       3       4          1 on the first 3 segments
    c       3       2          2 on the first segment ( 1 + 1) and 1 on the second segment

我的解决方案如下:

  • 如果值> =细分,则循环细分,并为每个细分添加1,直到调度等于
  • 如果值<然后,段按递减顺序在段上循环,并为每个段添加1,直到我们到达第一个段。区分与1的总数之间的差异,然后将其添加到第一个分段

源代码

所有示例(a,b,c)都在以下代码中表示。输出如下:

#example a [1, 1, 1, 1]
#example b [1, 1, 1, 0]
#example c [2, 1]

#!/usr/bin/env python

import os
import re
import sys
import argparse


if __name__ == "__main__":
    threshold = 4

    #(a) value = 3 and segments = 4
    dispatch = 1
    value = 4 + 1
    seg1 = [0,0,0,0]
    for i in range(0, len(seg1)):
        if dispatch == value:
            break
        seg1[i] += 1
        dispatch += 1

    print ("example a %s" %seg1)

    # (b) value = 3 and segments = 4
    dispatch = 1
    value = 3 + 1
    seg2 = [0,0,0,0]
    for i in range(0, len(seg2)):
        if dispatch == value:
            break
        seg2[i] += 1
        dispatch += 1

    print ("example b %s" %seg2)

    # (c) value = 3 and segments = 2
    value = 3 + 1
    dispatch = 1
    seg3 = [0,0]
    for i in range(len(seg3) - 1, -1, -1):
        if i == 0:
            seg3[i] = value - dispatch
            break
        seg3[i] += 1
        dispatch += 1

    print ("example c %s" %seg3)

问题

我发现我使用的解决方案非常难看。我不能从例子中推断出一个公式。我们可以从示例中推断出一个公式吗?这将使算法有一个像它背后的公式lol

  

我的代码在C中,但我发现在python中表示它更容易   这里。

2 个答案:

答案 0 :(得分:1)

可能在实施中有用的一些信息:

V为值的总数,S为段的总数。

1)每个细分将获得的最小值数:V/S。 (考虑整数除法)。

2)现在我们剩下V%S个值,因为每个S段都会获得V/S个值。 对于V%S值,您只需从1 to V%S运行循环并将1添加到每个细分中。

<强>代码:

#include<stdio.h>

int main()
{
    int V=10;  //no. of values
    int S=4;   //no. of segments

    int arr[4];  //Considering 0-based indexing
    int minimumValues = V/S;
    int remaining = V%S;
    for(int i=0;i<S;i++)
    {
        arr[i]=minimumValues;

        if(i<remaining)
            arr[i]++;
    }

    for(int i=0;i<S;i++)
        printf("%d, ",arr[i]);
    return 0;
}

答案 1 :(得分:1)

数学公式非常简单:

value / segments

为您提供至少必须放入每个细分的商品数量

value % segments

为您提供接收额外项目的细分数量

举例:

                      v/s    v%s
a       4       4      1      0
b       3       4      0      3
c       3       2      1      1

有了这个,你会得到一个非常简单的算法:

unsigned int n = value/segments;
unsigned int c = value%segments;
for(unsigned int i = 0; i < segments; ++i)
    theSegments[i] = n + (i < c);

或者,如果你想跳过数组:

unsigned int f(unsigned int values, unsigned int segments, theSegment)
{
    // assuming theSegment being checked for < segments
    return value/segments + (theSegment < value%segments) 
}

如果你想使用一个基于1的数组(索引0为虚拟):

for(unsigned int i = 1; i <= segments; ++i)
    theSegments[i] = n + (i <= c);