题目也就是 2 24 2^{24} 224看起来很吓人,其实这个数字无非是16 777 216,连int都没超,而且根据题意无非是最多600* 800个数字,每个数字最多600*800,但是开数组直接拿下标映射显然不行,所以选择用map统计即可,或者采用vector存储所有数字,因为dominant color出现半数以上,那么排序后最中间的那个数字也即是众数,因此也可以排完序获取中间数字(因为下标从0开始,所以取得数字是color.size()/2 )。
因为题目说了dominant color要超过半数,所以采用map统计时一种颜色出现半数以上的时候就可以终止循环了。
还有这里涉及最多600*800个输入,有人说用cin超时了,虽然我用cin没有超时,不过鉴于这里输入已经挺频繁了还是有意识地用scanf比较好。
采用map:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll M,N;
cin >> M >> N;
unordered_map<ll ,ll> mp;
ll res=0,ans=0;
for(ll i=0;i<N;i++){
for(ll j=0;j<M;j++){
ll tmp;
cin >> tmp;
if(mp.count(tmp)==0){
mp[tmp]=1;
}else mp[tmp]++;
if(mp[tmp]>res){
res=mp[tmp];
ans=tmp;
if(res>M*N/2) break;//超出一半就不需要接着统计了
}
}
}
cout << ans;
return 0;
}
·
·
·
采用排序
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll M,N;
cin >> M >> N;
vector<ll> color;
for(ll i=0;i<N;i++){
for(ll j=0;j<M;j++){
ll tmp;
scanf("%lld",&tmp);
color.push_back(tmp);
}
}
sort(color.begin(),color.end());
cout << color[color.size()/2];
return 0;
}