二分贪心--24

来源:互联网 发布:unity开发3d麻将源码 编辑:程序博客网 时间:2024/06/05 16:16

题目大概:

输出n组数据,m个参赛者,找出这m个参赛者中  在这n组数据中  出现的次数  第二多的人。

思路:

结构体,里面有参赛者的编号和出现次数,并建立一个数组q[n]。

对这个数组按出现次数由大到小排序,若一样大则按照编号从小到大排序。

然后找出其中的最大的,在寻找出第二多的数量,由于排序已经排好,第二多出现次数的参赛者是挨着的,直接输出就可以了。

感想:

容易超时。

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio.>using namespace std;struct q{int s,d;};bool cmp(q c,q b){if(c.d>b.d)return 1;else {if(c.d==b.d){if(c.s<b.s)return 1;else return 0;}else return 0;}}q a[10001];int main(){int n,m,b;    while(scanf("%d%d",&n,&m)){memset(a,0,sizeof(a));    if(n==0&&m==0)break;    for(int i=1;i<=n;i++)    {for(int j=1;j<=m;j++)      {scanf("%d",&b);      a[b].s=b;      a[b].d++;      }    } sort(a,a+10000,cmp); int k=a[0].d,j=1; for(int i=1;i<=10000;i++) {if(j)if(k!=a[i].d){k=a[i].d;j=0;k=a[i].d;} if(!j){if(k==a[i].d)printf("%d ",a[i].s); else break;} }printf("\n");}    return 0;}


0 0
原创粉丝点击