SPOJ:竞争对手的日子

时间:2013-02-06 17:51:14

标签: c algorithm

我正在努力解决问题SPOJ上竞争对手的日子。我尝试了以下方法:

我找到了最好的初始球员,所以最初有第一名的球员是最好的球员。在此之后,我迭代所有玩家并为他们每个人尝试看看当前最好的玩家是否比这更好,如果是这样的话,这不是很好的丢弃它(因为存在一些比这更好的玩家),否则我将它添加到最佳播放器列表中。最后,我将输出最佳球员的数量。

    for(i=0; i<num; i++)
    {
        for(j=0; j<ctr; j++)
        {               
            // i is already in best
            if(i == best_n[j])
                break;                        
            if((elmts[i].a < elmts[best_n[j]].a) ||
                    (elmts[i].b < elmts[best_n[j]].b) ||
                    (elmts[i].c < elmts[best_n[j]].c))
            {
                continue;
            }
            else
            {
                break;
            }
        }
        if(j>=ctr)
        {
            best_n[ctr] = i;
            ctr ++;
        }
    }

num是玩家的数量,ctr是迄今为止最佳阵列中的玩家数量。但我得到了错误的答案。我试图再次运行一个循环来验证最好的,如果任何一个球员比其他任何球员更糟,但这也导致错误的答案。另外,我不认为我的方法是有效的,在最坏的情况下它将是n ^ 2。你能帮我解决一下我的错误吗?我怎样才能提高它的效率呢?

1 个答案:

答案 0 :(得分:1)

一个问题是,您的算法需要删除best_n中当前优于。{/ p>的所有元素。

考虑:

1 5 5 // inserted into best at start
5 1 1 // inserted into best at start
3 4 4 // not worse than any of the above, insert into best
4 3 3 // not worse than any of the above, insert into best
2 2 2 // better than 3 4 4 and 4 3 3

(伪)代码看起来像:(如果在每场比赛中当前更好,我们必须用当前替换另一个)

// define '<' as 'better than'
if (not best[j] < elmts[i])
  if (elmts[i] < best[j])
    remove best[j]
    ctr--
  continue
else break

高效解决方案:

O(n^2)可能太慢了。 Here是高效解决方案的高级概述。 Here是可能有效的C ++代码。