BZOJ5204: [CodePlus 2018 3 月赛]投票统计
【传送门:BZOJ5204】
简要题意:
有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1
题解:
直接搞
离散化,然后判断就可以了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; struct LSnode { int x,p,z; }A[110000],B[110000]; int cmp(const void *x1,const void *x2) { LSnode n1=*(LSnode *)x1; LSnode n2=*(LSnode *)x2; return n1.x-n2.x; } int s[110000]; int id[110000]; int back[110000]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&A[i].x); A[i].p=i; } for(int i=1;i<=n;i++) { B[i].x=A[i].x; B[i].p=A[i].p; } qsort(B+1,n,sizeof(LSnode),cmp); B[1].z=1; for(int i=2;i<=n;i++) { if(B[i].x==B[i-1].x) B[i].z=B[i-1].z; else B[i].z=B[i-1].z+1; } int zz=0; for(int i=1;i<=n;i++) { A[B[i].p].z=B[i].z; zz=max(zz,B[i].z); } for(int i=1;i<=n;i++) back[A[i].z]=A[i].x; memset(s,0,sizeof(s)); int mmax=0; for(int i=1;i<=n;i++) { s[A[i].z]++; mmax=max(mmax,s[A[i].z]); } int len=0; for(int i=1;i<=zz;i++) if(s[i]==mmax) id[++len]=back[i]; if(len==zz) printf("-1\n"); else { printf("%d\n",len); for(int i=1;i<len;i++) printf("%d ",id[i]); printf("%d\n",id[len]); } } return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚