题解 | #投票统计#
投票统计
https://ac.nowcoder.com/acm/problem/15203
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t; cin>>t;
while(t--){
int n,i,j; cin>>n;
int a[n];
pair<int,int> t[n];//first存数量,second存编号
for(int i=0; i<n; i++) scanf("%d",&a[i]);//输入题目编号
sort(a,a+n); //题目编号排序
t[0].second=a[0]; t[0].first++;//存好第一个题目编号,数量加一
for(i=0,j=1; j<n; )//开始遍历投票的题目编号
{
while(t[i].second == a[j])//如果遍历到的题目与所维护的相同
j++, t[i].first++; //该题目数量加一,并遍历下一道题
i++, t[i].second=a[j]; //否则维护新出现的题目
}
sort(t,t+i);//排序,pair会先对first即数量排序,再对second编号排序
i--;//退出循环后i为被投票的题目数,减一变成最大下标
int cnt = i; //标记最大下标
//如果后一道题与前一道数量相同,下标前移
while(t[i].first == t[i-1].first) i--;
if(i==0) cout<<"-1"<<endl;//如果i等于0,说明所有题目票数相同
else{ //否则输出拥有最高票数的题目数
cout<<cnt-i+1<<endl; //用最大下标减去最小下标加一获得
for(int j=i; j<=cnt; j++)//如果最高票数题目有多个,遍历输出题目
cout<<t[j].second<<' ';
cout<<endl;
}
}
}