将n个对象分成m组的最简单方法,其中m不分n?

时间:2014-08-27 13:15:37

标签: c++ algorithm integer-arithmetic

我有两个整数mnm < n。通常,m不会划分n

n = m*q + r,其中qnm的整数商,r是余数(0 <= r < m) 。如果我们将n个对象尽可能均匀地分成m个框,则r个框将包含q+1个对象,其余框将包含q个对象。假设对象从1索引到n,并且它们按顺序插入到框中。此外,假设第一个r框包含q+1个对象。

我想编写一个返回索引列表i1, i2, ..., im的函数,这样i1是第一个框中最小对象的索引,i2最小的索引第二个框中的对象,依此类推。

我可以想到自己编写这个函数的几种方法,但我认为它们太复杂了。我相信有一种简单的方法可以做到这一点,我没有看到。

3 个答案:

答案 0 :(得分:2)

好吧,我没有完全明白你想要说的是什么,按顺序插入方框中,所以我会为你提供2种可能含义的解决方案。

a)将对象插入框中,如下所示:

9|
5|6|7|8
1|2|3|4

在这种情况下,解决方案非常简单:只需打印从1到m的所有数字。

代码:

function foo(int n, int m) {
    for (int k=1; k<=m; k++)
        cout<<k<<endl;
}

b)将对象插入框中,如下所示:

3|6|
2|5|8|10
1|4|7|9

在这种情况下,对于每个框,框k中索引最小的对象是:(n / m)*(k-1)+ min(k,n%m + 1)

代码:

function foo(int n, int m) {
    for (int k=1; k<=m; k++)
        cout<<(n / m) * (k - 1) + min(k, n % m + 1)<<endl;
}

答案 1 :(得分:1)

q个对象添加到每个框中。如果该框是n - m*q == n % m第一个框之一,请添加一个额外的对象:

std::vector<int> starts_of(int n, int m)
{
    std::vector<int> v;

    int q = n / m;
    int s = 1;

    for (int i = 0; i < m; i++) {
        v.push_back(s);
        s += q;
        if (i < n % m) s++;
    }

    return v;
}

答案 2 :(得分:0)

r = n % m
d = n / m
//with two loops without conditionals:
for i = 0..r - 1
   I[i] = 1 + i * d  + i    
for i = r..m - 1
   I[i] = 1 + i * d + r
//or with single loop:
for i = 0..m - 1
   I[i] = 1 + i * d  + min(i, r)