0

这是算法http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html 这是我的代码

#include <iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int ans,counter=0,a,temp=0,time=0;
    while(temp<n){
        cin>>a;
        if(counter==0)
        {
            counter=1;
            ans=a;
        }
        else if(counter>0){
            if(ans==a)
                ++counter;
            else
                --counter;
        }
        ++temp;
    }
    cout<<"The number "<<ans<<" is in the more majority ";
}

我的问题是当你给 6 6 1 2 3 它说 3 占多数

我的问题在哪里?谢谢

4

2 回答 2

2

你正确地实现了算法,但你没有正确解释它。

该算法假定存在多数元素(超过一半的元素是该特定元素)并返回它。如果假设不成立,则必须检查整个序列两次以检查是否确实存在多数。

在您的示例中,没有多数,因此该算法不起作用。

于 2013-10-28T19:48:48.943 回答
1

我认为您得到了给定数据的预期答案。关键是来自链接页面的引用:

“当我们完成后,如果有多数的话,当前的候选人就是多数派。”

在这种情况下,没有多数,因此算法返回无效结果。输入再试一次6 6 6 1 2


这是一个教授不太可能接受的没有数组的实现:

#include <iostream>
using namespace std;
int majority(int n,int &ans,int counter){
  int a,i;
  if (!n) return 0;
  cin>>a;
  if (!counter) ans=a;
  counter+=2*(ans==a)-1;
  i=majority(n-1,ans,counter);
  return i+(ans==a);
}
int main(){
  int n,ans;
    cin>>n;
     if (n/2 < majority(n,ans,0))
        cout<<"The number "<<ans<<" is in the more majority "<<endl;
     else 
        cout<<"No majority"<<endl;
}
于 2013-10-28T19:47:47.567 回答