我有两个整数m
和n
,m < n
。通常,m
不会划分n
。
说n = m*q + r
,其中q
是n
和m
的整数商,r
是余数(0 <= r < m
) 。如果我们将n
个对象尽可能均匀地分成m
个框,则r
个框将包含q+1
个对象,其余框将包含q
个对象。假设对象从1
索引到n
,并且它们按顺序插入到框中。此外,假设第一个r
框包含q+1
个对象。
我想编写一个返回索引列表i1, i2, ..., im
的函数,这样i1
是第一个框中最小对象的索引,i2
最小的索引第二个框中的对象,依此类推。
我可以想到自己编写这个函数的几种方法,但我认为它们太复杂了。我相信有一种简单的方法可以做到这一点,我没有看到。
答案 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)