yyy loves Maths VI (mode) - 洛谷
本篇可以看做题解。
看到这道题,不就是找众数吗!太简单了——
#include<iostream>
#include<algorithm>
using namespace std;
string a[2000001];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
cout<<a[n/2]<<endl;
return 0;
}
结果,当然的,MLE了。。。
于是,我想着优化:
因为此题数字巨大,所以肯定不能枚举。
所以我就有了一个思路:
因为肯定有数字占数列的一半以上,所以我们设一个变量,这个变量保存众数。
如果变量里的数字与自己相同,cnt++;
否则,因为占一半以上,所以抵消一个变量中的数。
但众数占一半以上,所以无论你怎么抵消,变量里面肯定都仍然是众数。
思路有点不好理解,多打几遍代码,就好了。要知道,众数,是指一组数据中出现次数或出现频率最多的数值。
但此题中,众数占了大多数。有差别的。
代码:
#include<iostream>
using namespace std;
int n,m;
int h,cnt;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m;
if(h==m) cnt++;
if(!cnt)
{
h=m;
cnt++;
}
if(h!=m) cnt--;
}
cout<<h<<endl;
return 0;
}