题解 | #投票统计#
投票统计
https://ac.nowcoder.com/acm/problem/15203
一看离散化,一手STL,来个map,用个sort,反手再加一个unique,提交,发现95%,用时:1001ms。这时候,再细看一下题,1e5,也不是很大呀,em... 发现STL用的多了,去掉sort,unique。就用map. 解题思路: 输入,存入map,并将map[输入元素]++。遍历map,用迭代器或者auto,先找最大值,之后再遍历,找跟最大值相同的,让ans++。最后判断最大值个数与输入个数是否相等,相等--"-1",否则输出ans,再遍历一遍,将与最大值相等的打印出来。 [it->first 表示题目编号 it->second 表示题目编号表示的作品的选票]
#include <vector>
#include <string>
#include <set>
#include <map>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define rep(i,x,n) for(int i = x; i <= n; i++)
typedef long long LL;
typedef pair<int,int> PII;
const int N = 100021;
int p[N];
map<int,int> mp;
void test();
void solve() {
int n;
cin>>n;
mp.clear(); // mp 全局变量,每次清零。
int ma = 0;
for(int i = 0; i < n; ++i) {
int k;
cin>>k;
mp[k]++; // 映射
ma = max(ma, mp[k]); // 找最大票数。
}
int cnt = 0;
// 迭代器遍历
// it->second -- 票数;
// it->first -- 编号;
for(map<int,int>::iterator it = mp.begin(); it != mp.end(); ++it) {
if(ma == it->second) cnt++;
}
// 票数都一样
if(cnt == mp.size()) {
cout<<-1<<endl;
return ; // 结束
}
cout<<cnt<<endl;
for(map<int,int>::iterator it = mp.begin(); it != mp.end(); ++it) {
// 查找编号
if(ma == it->second) cout<<it->first<<" ";
}
cout<<endl;
}
int main()
{
//test();
//ios::sync_with_stdio(false); cin.tie(0),cout.tie();
int t;
scanf("%d", &t);
while(t--) solve();
return 0;
}
void test() {
#define mytest
#ifdef mytest
freopen("ANSWER.txt", "w",stdout);
#endif
}