我有两个整数 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
第二个盒子中最小对象的索引,依此类推。
我自己可以想出几种方法来编写这个函数,但我认为它们太复杂了。我相信有一种我没有看到的简单方法可以做到这一点。
最佳答案
好吧,我没有完全理解你想说的“按顺序插入盒子”的意思,所以我会为你提供两种可能含义的解决方案。
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;
}
关于c++ - 将 n 个对象分成 m 个集合的最简单方法,其中 m 不除 n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25528196/