c++ - 将 n 个对象分成 m 个集合的最简单方法,其中 m 不除 n?

标签 c++ algorithm integer-arithmetic

我有两个整数 mn , 与 m < n .一般来说,m不除 n .

n = m*q + r , 其中qn 的整数商和 m , 和 r是余数 ( 0 <= r < m )。如果我们拆分n对象进入 m盒子尽可能均匀,r的盒子将包含 q+1对象,其余框将包含 q对象。假设对象索引自 1n , 并按顺序将它们插入盒子中。此外,假设第一个 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/

相关文章:

c++ - 澄清函数体/C++

c++ - 在销毁对象之前锁定对象的互斥体将释放内存或其他一些意外的

algorithm - 为一组 3D 矩形项目找到最佳 3D 框尺寸

java - 反模问题 where gcd(denominator,mod)!=1

c - Baum Welch 算法的初始隐马尔可夫模型

c++ - 从单个数组的不同段初始化 Eigen::Vector

c - 使用各种格式说明符打印 short int

java - 圆长从 1004L 到 1000L(或 1006L 到 1010L)

c - 无符号整数减法是否定义了行为?

c++ - 解码 MP4 h264 RTP 视频流 C++