A1056 Mice and Rice (25 分)

根据题意作出思考如下图:

 

可以发现,这个 fatest mouse 的筛选是一层一层下来的,每一层都将数组分为两部分——一部分继续下一轮筛选而另一部分执行记下排名就行。所以很自然能想到每一轮都会产生中间数据,这些中间数据需要变量记录下来,所以进一步思考如下图:

 

遍历原数组,筛选出的下一轮数据保存到影子数组(中间数据),至于 loser 因为要记录排名所以也要保存下来——这里先随便用 vector 保存。可以用这个思路接着推演,最终得到的一个元素就是 fatest mouse。在这个过程中需要考虑 loser 的排名怎么记录比较方便,我这里是数 winers 有多少个,那么 loser 的排名就等于 winers 个数加一,如下图:

 

 

 

综合上述思路,得到代码思路

/* 伪码 */

while (数组剩余长度不等于 1) {
    组 = 0; base = 0; end = 0;
    while (end < 数组剩余长度) {
        step = 数组剩余长度 - base < NG ? 数组剩余长度 - base : NG;
        end += step;
        sort(base, end, cmp);//cmp() 为递增序
        vector.push_back[base + 1, end);//将除最大值外其它元素追加到 vector
        max = 数组[base];
        数组[组++] = max;
        base = end;
    }
    func(vector 里所有元素名次 = 组 + 1);//这里就是将所有 loser 记下排名的处理步骤
    数组剩余长度 = 组;
    vector.clear();
}

 

点击获取完整代码

posted @ 2021-02-04 23:21  幼麟  阅读(48)  评论(0编辑  收藏  举报